-
Posts
62 -
Joined
-
Last visited
-
Feedback
0%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by EAkar
-
-
On 12/2/2021 at 2:14 AM, Near said:
Could someone please help me with these errors?
https://metin2.download/picture/FVrunE0od7GBgdiV9Cl9ACT02F7ZDblJ/.png
https://metin2.download/picture/fJnR1H6414lCX346sh9h15skLwvbr2jG/.pngThe first is the syserr when opening the window, and the second is that the options menu does not close.
if app.BL_MOVE_CHANNEL: class MoveChannelDialog(ui.ScriptWindow): def __init__(self): ui.ScriptWindow.__init__(self) self.__LoadDialog() self.IsShow = False def __del__(self): ui.ScriptWindow.__del__(self) def __LoadDialog(self) : try: pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "UIScript/MoveChannelDialog.py") except: import exception exception.Abort("MoveChannelDialog.__LoadDialog") self.ParentBoard = self.GetChild("MoveChannelBoard") self.ChildBoard = self.GetChild("BlackBoard") self.GetChild("MoveChannelTitle").SetCloseEvent(ui.__mem_func__(self.Close)) self.ChannelList = [] cnt = 5 cnt = cnt - 1 # 99서버 제외 self.DlgWidht = 190 self.BlackBoardHeight = 23*cnt + 5*(cnt-1) + 13 self.DlgHeight = self.BlackBoardHeight + 75 self.AcceptBtn = ui.MakeButton(self.ParentBoard, 13, self.DlgHeight - 33, "", "d:/ymir work/ui/public/", "middle_button_01.sub", "middle_button_02.sub", "middle_button_03.sub") self.AcceptBtn.SetText( localeInfo.MOVE_CHANNEL_SELECT ) self.AcceptBtn.SetEvent(ui.__mem_func__(self.AcceptButton)) self.CloseBtn = ui.MakeButton(self.ParentBoard, self.DlgWidht - 73, self.DlgHeight - 33, "", "d:/ymir work/ui/public/", "middle_button_01.sub", "middle_button_02.sub", "middle_button_03.sub") self.CloseBtn.SetText( localeInfo.MOVE_CHANNEL_CANCEL ) self.CloseBtn.SetEvent(ui.__mem_func__(self.Close)) for i in xrange(cnt): btn = ui.MakeButton(self.ChildBoard, 8, 6 + i*28, "", "d:/ymir work/ui/game/myshop_deco/", "select_btn_01.sub", "select_btn_02.sub", "select_btn_03.sub") btn.SetText("Kanal {0}".format(int(i+1))) btn.SetEvent(ui.__mem_func__(self.__SelectChannel), i+1) self.ChannelList.append(btn) self.ParentBoard.SetSize(self.DlgWidht, self.DlgHeight) self.ChildBoard.SetSize(self.DlgWidht - 26, self.BlackBoardHeight) self.SetSize(self.DlgWidht, self.DlgHeight) self.UpdateRect() def __SelectChannel(self, idx): self.ChangeChannelNumber = idx for btn in self.ChannelList: btn.SetUp() btn.Enable() self.ChannelList[idx-1].Down() self.ChannelList[idx-1].Disable() def AcceptButton(self): if self.ChangeChannelNumber == self.StartChannelNumber: return net.MoveChannelGame(self.ChangeChannelNumber) self.StartChannelNumber = self.ChangeChannelNumber self.Close() def Show(self) : ui.ScriptWindow.Show(self) self.StartChannelNumber = net.GetChannelNumber() self.__SelectChannel(self.StartChannelNumber) self.IsShow = True def Close(self): self.Hide() self.IsShow = False def OnPressEscapeKey(self): self.Close() return True def IsShowWindow(self): return self.IsShow
İnterFaceModule.py
if app.BL_MOVE_CHANNEL:
def RefreshServerInfo(self, channelNumber):
if self.wndMiniMap:
self.wndMiniMap.RefreshServerInfo(channelNumber)
Game.py
if app.BL_MOVE_CHANNEL:
def __SeverInfo(self, channelNumber, mapIndex):
#print "__SeverInfo %s %s" % (channelNumber, mapIndex)
_chNum = int(channelNumber.strip())
_mapIdx = int(mapIndex.strip())
if _chNum == 99:
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_CHANNEL_NOTICE_GAME_99)
elif _mapIdx >= 10000:
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_CHANNEL_NOTICE_DUNGEON)
else:
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_CHANNEL_NOTICE % _chNum)
net.SetChannelName(_chNum)
net.SetMapIndex(_mapIdx)
self.interface.RefreshServerInfo(channelNumber) -
I do not recommend using it this way. Develop and use.
-
11 hours ago, Vaynz said:
The tutorial is complete, for those who have problems with this "pack_open" not defined
Search: ShopData = pack_open(REMOTE_FILE_NAME, "r").readlines() Change with: ShopData = open(REMOTE_FILE_NAME, "r").readlines()
And if you have problem with buying items is from ENABLE_MULTISHOP, you have to adapt the system in localeinfo.py and uishop.py in function AskBuyItem.
70,75,48 is from your mysql player -> shop_item (Vnum where is opening the shop with items "doing what you want")
Example:
Like in my case ->shop item : Vnum (3 is to open the window with weapons and where you find items)
In player -> shop you have (Shop vnum - (3), Name (bla bla), NPC - Npc vnum (9001) ) example
In remote_shop_names.txt you have to put them like how in input_main.cpp vnum it is. Example (3, )
Locale- 3 go first and name in remote_shop_names.txt -> Weapons
If we go for a new shop (Do same like weapons and go in input_main.cpp vnum in row 3, 4, 5) and in remote shop again do that
3 = Weapons
4 = Armors
5 = General.
- How Input_main.cpp how looks
How remote_shop_names looks.
Sorry for bad english and bad "explain", i just woke up. I hope you understood the idea.
"Market name is working" aswell, maybe u missed something from tutorial.
I installed the system without any problems. I guess it doesn't match.
-
1
-
-
Edit : Fixed.
npc vnum = player.shop(npc_vnum) WRONGGGG
player.shop open (vnum) true
Example :
1 ???? 9001
2 ????? 9009
3 ???? 9003
4 ????? 9002
9001 wrong
1 true
also
The market name is not written. Market name : None
-
70, 75, 48, 107
Are there npc codes in mob_proto in these numbers
9001 9002 9003 these codes are not.
1 ???? 9001
2 ????? 9009
3 ???? 9003
4 ????? 9002 -
There is lag in the system.
The key opens the lock. But after 4 5 seconds it turns on. Or I have to open it with the key again for it to appear.
Someone else on another forum has the same problem. Add if you can fix the problem. I wouldn't recommend it if you can't fix the problem. Good Morning.
Lag starts when 3 keys are requested. But there is no problem with 2 keys. As I said, when it starts asking for 3 or 4 keys, there is lag. (Note: I didn't lock 3 4 inventory. I only locked my 4th inventory.
const DWORD c_Inventory_Open_Page_Count = 3;
continuation of the video
also doing this instead of make_unique.
s_grid[i] = std::unique_ptr <CGrid>(new CGrid(INVENTORY_WIDTH,INVENTORY_HEIGHT));
and
s_grid[i] = std::unique_ptr<CGrid>(new CGrid(INVENTORY_WIDTH,new_size));
-
make_unique throws an error when using c++11.
I am using C++11.
CC = g++8
CXXFLAGS = -std=c++11 -Wl,-rpath=/usr/local/lib/gcc8c++14 is required. I researched.
When I change make_unique to unique_ptr I get error again. How can i solve this.
-
On 10/28/2021 at 3:13 PM, Mali said:
weapon costume is not my system, just look at other codes for the solve problem.
I'm not mad at you trabzon
but you might have an idea what the problem is. Only you can help with this. The costume system may not be yours. But you can help. It still doesn't matter if you're not helping. After all, you shared this system with us. You are a really good person. Not everyone can do this. entrust it to Allah.
On 10/28/2021 at 11:38 AM, aberious said:send discord men...
Metin2Shooping#3082
-
No Problem : (look image) -- Everything looks good.
I used a costume weapon on it. Everything is fine and there are no problems.
and the biggest problem!!!
When I remove the costume weapon, the original weapon appears. But the runic sword must appear.
case ITEM_WEAPON: { #ifdef ENABLE_WEAPON_COSTUME_SYSTEM if (0 != m_pOwner->GetWear(WEAR_COSTUME_WEAPON)) break; #endif if (bAdd) { #if defined(__BL_TRANSMUTATION__) if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON) m_pOwner->SetPart(PART_WEAPON, GetTransmutationVnum() > 0 ? GetTransmutationVnum() : GetVnum()); #else if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON) m_pOwner->SetPart(PART_WEAPON, GetVnum()); #endif } else { if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON) m_pOwner->SetPart(PART_WEAPON, 0); } } break;
-
MOVE_CHANNEL_NOTICE_GAME_99 You are connected with the Affiliate Channel.
MOVE_CHANNEL_NOTICE_DUNGEON You are connected to a dungeon channel or a map.
if app.BL_MOVE_CHANNEL:
def __SeverInfo(self, channelNumber, mapIndex):
#print "__SeverInfo %s %s" % (channelNumber, mapIndex)
_chNum = int(channelNumber.strip())
_mapIdx = int(mapIndex.strip())
if _chNum == 99:
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_CHANNEL_NOTICE_GAME_99)
elif _mapIdx >= 10000:
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_CHANNEL_NOTICE_DUNGEON)
else:
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_CHANNEL_NOTICE % _chNum)
net.SetChannelName(_chNum)
net.SetMapIndex(_mapIdx)
self.interface.RefreshServerInfo(channelNumber) -
After performing these operations, the PAGE_DESC text of your wonexchange system will not appear.
-
if (!ch)
return;
Owsap may have forgotten because he loves game.core so much. Please add just in case.
I deleted the folder. keep it if it's void and false if it's bool. -
delete these ridiculous codes and just fix it with python code.
## ÀÚµ¿¹°¾à (#72723, #72724) Ư¼öó¸® - ¾ÆÀÌÅÛÀε¥µµ ½½·Ô¿¡ È°¼ºÈ/ºñÈ°¼ºÈ Ç¥½Ã¸¦ À§ÇÑ ÀÛ¾÷ÀÓ - [hyo] if constInfo.IS_AUTO_POTION(itemIndex): # metinSocket - [0] : È°¼ºÈ ¿©ºÎ, [1] : »ç¿ëÇÑ ¾ç, [2] : ÃÖ´ë ¿ë·® metinSocket = [player.GetItemMetinSocket(Position, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)] if 0 != int(metinSocket[0]): slot.ActivateSlot(slotNumber) else: slot.DeactivateSlot(slotNumber)
elif player.SLOT_TYPE_SKILL == Type: skillIndex = player.GetSkillIndex(Position) if 0 == skillIndex: slot.ClearSlot(slotNumber) continue skillType = skill.GetSkillType(skillIndex) if skill.SKILL_TYPE_GUILD == skillType: import guild skillGrade = 0 skillLevel = guild.GetSkillLevel(Position) else: skillGrade = player.GetSkillGrade(Position) skillLevel = player.GetSkillLevel(Position) slot.SetSkillSlotNew(slotNumber, skillIndex, skillGrade, skillLevel) slot.SetSlotCountNew(slotNumber, skillGrade, skillLevel) slot.SetCoverButton(slotNumber) ## NOTE : CoolTime üũ if player.IsSkillCoolTime(Position): (coolTime, elapsedTime) = player.GetSkillCoolTime(Position) slot.SetSlotCoolTime(slotNumber, coolTime, elapsedTime) ## NOTE : Activate µÇ¾î ÀÖ´Ù¸é ¾ÆÀÌÄܵµ ¾÷µ¥ÀÌÆ® if player.IsSkillActive(Position): # if not slotNumber in self.Jeaktivni: slot.ActivateSlot(slotNumber) # self.Jeaktivni.append(slotNumber) # else: # if slotNumber in self.Jeaktivni: # slot.DeactivateSlot(slotNumber) # self.Jeaktivni.remove(slotNumber)
-
These operations give game.core. Game gives core on loading screen.
No wrong additions. Everything is correct. There was no kernel crash prior to doing this action.char.h
#ifdef ENABLE_ITEM_GRID_MAP
std::unordered_map<BYTE, BYTE> pItemsGridMap;
#else
BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX];
#endif
and
LPITEM GetInventoryItem(WORD wCell) const;
#ifdef ENABLE_ITEM_GRID_MAP
BYTE ItemGridMapGetConst(BYTE cell_index) const;
#endif
char_item.cpp
bool CHARACTER::IsEmptyItemGrid(TItemPos Cell, BYTE bSize, int iExceptionCell) const { switch (Cell.window_type) { case INVENTORY: { WORD bCell = Cell.cell; ++iExceptionCell; if (Cell.IsBeltInventoryPosition()) { LPITEM beltItem = GetWear(WEAR_BELT); if (NULL == beltItem) return false; if (false == CBeltInventoryHelper::IsAvailableCell(bCell - BELT_INVENTORY_SLOT_START, beltItem->GetValue(0))) return false; #ifdef ENABLE_ITEM_GRID_MAP if (ItemGridMapGetConst(bCell)) { if (ItemGridMapGetConst(bCell) == iExceptionCell) return true; return false; } #else if (m_pointsInstant.bItemGrid[bCell]) { if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell) return true; return false; } #endif if (bSize == 1) return true; } else if (bCell >= INVENTORY_MAX_NUM) return false; #ifdef ENABLE_ITEM_GRID_MAP if (ItemGridMapGetConst(bCell)) { if (ItemGridMapGetConst(bCell) == iExceptionCell) #else if (m_pointsInstant.bItemGrid[bCell]) { if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell) #endif { if (bSize == 1) return true; int j = 1; BYTE bPage = bCell / (INVENTORY_MAX_NUM / INVENTORY_PAGE_COUNT); do { BYTE p = bCell + (5 * j); if (p >= INVENTORY_MAX_NUM) return false; if (p / (INVENTORY_MAX_NUM / INVENTORY_PAGE_COUNT) != bPage) return false; #ifdef ENABLE_ITEM_GRID_MAP if (ItemGridMapGetConst(p)) if (ItemGridMapGetConst(p) != iExceptionCell) return false; #else if (m_pointsInstant.bItemGrid[p]) if (m_pointsInstant.bItemGrid[p] != iExceptionCell) return false; #endif } while (++j < bSize); return true; } else return false; } if (1 == bSize) return true; else { int j = 1; BYTE bPage = bCell / (INVENTORY_MAX_NUM / INVENTORY_PAGE_COUNT); do { BYTE p = bCell + (5 * j); if (p >= INVENTORY_MAX_NUM) return false; if (p / (INVENTORY_MAX_NUM / INVENTORY_PAGE_COUNT) != bPage) return false; #ifdef ENABLE_ITEM_GRID_MAP if (ItemGridMapGetConst(p)) if (ItemGridMapGetConst(p) != iExceptionCell) return false; #else if (m_pointsInstant.bItemGrid[p]) if (m_pointsInstant.bItemGrid[p] != iExceptionCell) return false; #endif } while (++j < bSize); return true; } } break; case DRAGON_SOUL_INVENTORY: { WORD wCell = Cell.cell; if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM) return false; iExceptionCell++; if (m_pointsInstant.wDSItemGrid[wCell]) { if (m_pointsInstant.wDSItemGrid[wCell] == iExceptionCell) { if (bSize == 1) return true; int j = 1; do { int p = wCell + (DRAGON_SOUL_BOX_COLUMN_NUM * j); if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM) return false; #ifdef ENABLE_ITEM_GRID_MAP if (ItemGridMapGetConst(p)) #else if (m_pointsInstant.bItemGrid[p]) #endif if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell) return false; } while (++j < bSize); return true; } else return false; } if (1 == bSize) return true; else { int j = 1; do { int p = wCell + (DRAGON_SOUL_BOX_COLUMN_NUM * j); if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM) return false; #ifdef ENABLE_ITEM_GRID_MAP if (ItemGridMapGetConst(p)) #else if (m_pointsInstant.bItemGrid[p]) #endif if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell) return false; } while (++j < bSize); return true; } } break;
void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem) #endif { WORD wCell = Cell.cell; BYTE window_type = Cell.window_type; if ((unsigned long)((CItem*)pItem) == 0xff || (unsigned long)((CItem*)pItem) == 0xffffffff) { sys_err("!!! FATAL ERROR !!! item == 0xff (char: %s cell: %u)", GetName(), wCell); core_dump(); return; } if (pItem && pItem->GetOwner()) { assert(!"GetOwner exist"); return; } switch (window_type) { case INVENTORY: case EQUIPMENT: { if (wCell >= INVENTORY_AND_EQUIP_SLOT_MAX) { sys_err("CHARACTER::SetItem: invalid item cell %d", wCell); return; } LPITEM pOld = m_pointsInstant.pItems[wCell]; if (pOld) { if (wCell < INVENTORY_MAX_NUM) { for (int i = 0; i < pOld->GetSize(); ++i) { int p = wCell + (i * 5); if (p >= INVENTORY_MAX_NUM) continue; if (m_pointsInstant.pItems[p] && m_pointsInstant.pItems[p] != pOld) continue; #ifdef ENABLE_ITEM_GRID_MAP m_pointsInstant.pItemsGridMap[p] = 0; #else m_pointsInstant.bItemGrid[p] = 0; #endif } } else #ifdef ENABLE_ITEM_GRID_MAP m_pointsInstant.pItemsGridMap[wCell] = 0; #else m_pointsInstant.bItemGrid[wCell] = 0; #endif } if (pItem) { if (wCell < INVENTORY_MAX_NUM) { for (int i = 0; i < pItem->GetSize(); ++i) { int p = wCell + (i * 5); if (p >= INVENTORY_MAX_NUM) continue; #ifdef ENABLE_ITEM_GRID_MAP m_pointsInstant.pItemsGridMap[p] = wCell + 1; #else m_pointsInstant.bItemGrid[p] = wCell + 1; #endif } } else #ifdef ENABLE_ITEM_GRID_MAP m_pointsInstant.pItemsGridMap[wCell] = wCell + 1; #else m_pointsInstant.bItemGrid[wCell] = wCell + 1; #endif } m_pointsInstant.pItems[wCell] = pItem; } break; case DRAGON_SOUL_INVENTORY: { LPITEM pOld = m_pointsInstant.pDSItems[wCell]; if (pOld) { if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM) { for (int i = 0; i < pOld->GetSize(); ++i) { int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM); if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM) continue; if (m_pointsInstant.pDSItems[p] && m_pointsInstant.pDSItems[p] != pOld) continue; m_pointsInstant.wDSItemGrid[p] = 0; } } else m_pointsInstant.wDSItemGrid[wCell] = 0; } if (pItem) { if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM) { sys_err("CHARACTER::SetItem: invalid DS item cell %d", wCell); return; } if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM) { for (int i = 0; i < pItem->GetSize(); ++i) { int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM); if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM) continue; m_pointsInstant.wDSItemGrid[p] = wCell + 1; } } else m_pointsInstant.wDSItemGrid[wCell] = wCell + 1; } m_pointsInstant.pDSItems[wCell] = pItem; } break;
#ifdef ENABLE_ITEM_GRID_MAP BYTE CHARACTER::ItemGridMapGetConst(BYTE cell_index) const { auto it = m_pointsInstant.pItemsGridMap.find(cell_index); if (it != m_pointsInstant.pItemsGridMap.end()) { return it->second; } else { return 0; } } #endif
#ifdef ENABLE_ITEM_GRID_MAP m_pointsInstant.pItemsGridMap.clear(); #endif #ifdef ENABLE_ACCE_SYSTEM m_bAcceCombination = false; m_bAcceAbsorption = false; #endif
I cleared the codes and the game opened
-
this system breaks root. imgct.py import it into game.py
After import imgct package root and try to open the game and it won't open. You will get a Runmain Error. Undo what you did and the game opens.
All py open NullNullNullNullNullNullNullNullNullNullNullNullNullNullNullNullNullNullNullNullNullNullNull-
1
-
-
none of the codes work for me.
-
1
-
-
On 10/19/2021 at 6:47 PM, Razer74 said:
Same problem but with costumes.
Now I tried it for the costume, I have the same problem.
It stays put on me when I put on the costume_body and take it off again.
We ask Mali61 for help on this issue. Hope it helps us. Or someone else.
-
Hello all, I hope you are well.
I added the fish puzzle system. But Z shows the puzzle as a square. The L puzzle looks like a square. How can i solve this. Thank you. Have a nice day.
GIF:
-
SetYPosistion
gives the syntax.
syntax error?
I think people can do work easier if you give your cpp and h files. Thank you.-
1
-
-
Peer.cpp add
#include <sstream>
net.GetChannelName
It has no function in my files. I installed the system without any problems. But I guess it doesn't match with my files. I'm changing channels, but the old channel count still remains under the minimap.That's why Vegas' editing works better.
edit game.py
self.interface.RefreshServerInfo(channelNumber)
Edit interfacemodule.py.
if app.BL_MOVE_CHANNEL:
def RefreshServerInfo(self, channelNumber):
if self.wndMiniMap:
self.wndMiniMap.RefreshServerInfo(channelNumber)edit minimap.py
if app.BL_MOVE_CHANNEL:
def RefreshServerInfo(self, channelNumber):
if channelNumber == 99:
serverInfoStr = serverInfo.SERVER_1 + ' - Common Channel'
else:
serverInfoStr = serverInfo.SERVER_1 + ' - ' + 'Channel ' + str(channelNumber)
self.serverInfo.SetText(serverInfoStr)
net.SetServerInfo(serverInfoStr)
fixed. -
For db syserr.txt, it always gives attrtype8 attrtype 9 attrtype10 ......... addfield syserr like this.
I add it for mailbox and it keeps asking me to add it. 10 11 12 13 14 like a joke -
If you adapt the transmutation system. BL_TRANSMUTATION
You will get db.core.
For clientmanagerboot.cpp set 512 to 1024.
-
Everything works smoothly. Thank you very much Mali61. There is just one small problem. The WJ_TRADABLE_ICON effect does not appear when the window is opened. If I just click on the window or object, the effect comes on.
-
53 minutes ago, V0lvox said:
I do have it like this:
if (bAdd) { #ifdef __CHANGE_LOOK_SYSTEM__ if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON) m_pOwner->SetPart(PART_WEAPON, GetItemLook() > 0 ? GetItemLook() : GetVnum()); #else if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON) m_pOwner->SetPart(PART_WEAPON, GetVnum()); #endif } else { if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON) m_pOwner->SetPart(PART_WEAPON, 0); }
The problem persists. The case is not related to ITEM_WEAPON. The problem is elsewhere. But I don't know where it is.
No problem with armor. There is only one problem with the gun.
@ MaliCan you help with this?
Thank You bro.
Official Transmutation / Change Look
in Features & Metin2 Systems
Posted · Edited by Metin2 Dev
Core X - External 2 Internal
Hahahaha![?](https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/3f.png)
These files are completely corrupt. You will have problems with the zodiac temple. This fault only applies to the zodiac trader. Shops like normal market gun dealers are not problematic. I'm removing this mirroring system from my files immediately. Very dangerous.
I advise you to use other mirroring system files. I do not recommend these files. It causes a lot of problems that you don't know about. Coincidentally I went out the zodiac multiples and found this problem.
That's why this system is very dangerous.