Jump to content
metin2dev

Leaderboard


Popular Content

Showing content with the highest reputation since 07/17/2018 in all areas

  1. 6 points
    Here are the item and mob proto from .DE The mob_proto struct isn't 100%! https://mega.nz/#!HdJUhKjQ!IItX_szmsg8miDPWEe64iNoyYnhaFnz190D7CNpBse4
  2. 5 points
    A long time ago I had to initiate the development of a small tool as a nesassary requirement for a huge project as seen above. Though a development of such a tool is not an easy thing - more rather it's a really difficult thing, but I got it done in the end.. The tool is called "GR2 Converter". Now I'm able to use any Metin2 Asset in the Unreal Engine 4 and the development of the game can really begin. The first preview of Metin2 map parts rendered by the Unreal Engine 4: (Click to see video)
  3. 5 points
    How the bug manifests? Client closes without any syserr How to reproduce the bug? Let' say you got textureset/metin2_map_c1.txt and inside you got an empty string like this: TextureSet TextureCount 17 Start Texture001 "" 5.000000 5.000000 0.000000 0.000000 0 0 0 End Texture001 Start Texture002 "d:\ymir work\terrainmaps\b\field\field 02.dds" 6.000000 6.000000 0.000000 0.000000 0 0 0 End Texture002 binary/src/source/PRTerrainLib/TextureSet.cpp Search this lin inside bool CTextureSet::SetTexture if (!pResource->IsType(CGraphicImage::Type())) And add before if (!pResource) return false; Search this line inside bool CTextureSet::AddTexture if (!pResource->IsType(CGraphicImage::Type())) And add before if (!pResource) return false;
  4. 4 points
    Link: MEGA Web: Lynx3D Info:
  5. 4 points
    Hi metin2dev! Today i would like to present you my latest project which is League Emote System. Presentation video: Functions available: - The system has 32 emotes. Players recieve only 1 emote, rest of them have to be unlocked with specific emote item. - Emotes can be unlocked individually! - The emotes are saved per character. - The selected emote will remain saved even if u log out. - The Emote Inventory is split in 2 pages 16 emotes / page. - Contain most of league coolest emotes. - To emote you have to hold 'K' key and click on the emote picture. The interface will close and show above your character head the emote. - The emote interface can be drag anywhere on the screen to have easy accces. Last but not least 'muje zenu'! Regards, meleme18
  6. 3 points
    Hi guys, Metin2 programming was kinda of a fun hobby for me. I've been working on this source files for about 10 months, but I have now more projects and academic work ahead of me, so I kinda won't have the time anymore to play with it. I was going to delete it today, but thought of sharing it first, it could help someone out there. It's not a great source code, but every problem I have encountered, I solved it. Here is a list of the things I've done (which I remember, there could be more):- Server Side: All upgrading scrolls are activated and working probably Devil Tower Blacksmith give 20% boost (and I believe that he give a fee discount also) Some pets can pickup items (CPetActor::isPickUpPet in PetSystem.cpp) Skills manuals now do give a success boost of 20% 7/8 skills now can be trained by books even before they reach m1, like the official version Guild banks have been activated (only depositing) Guild lands and other guild NPCs will now be bought by the yang in the guild's bank New quest function the change guild's gold (change_gold) Guild blacksmiths now have levels (will be explained later in the topic) Rituals Stone, Anti-Resistances and new monsters bonuses have been added eg. Strong Against Desert Monsters Transmutation system is working probably, even with weapons costumes Most events drops now is managed by the source, you won't need to make a quest for the drop. as soon as you activated the game flag, the associated item will start dropping (managed in void ITEM_MANAGER::CreateQuestDropItem in item_manager.cpp) Events that has special NPCs eg. Christmas and Ramadan event, the NPCs will summoned automatically in their respected location (managed in questmanager.cpp in void CQuestManager::SetEventFlag) mapindex GM command will return the map index GM restrict system is in place, they can't trade, friend, duel with normal players. IMPLEMENTOR Level is not affected by that restriction. Almost everything I've added is controllable by a macro Client Side: A lot of function has been added:- GetMasterPID returns the Guild leader PID, used later to prevent a visual bug where a member with withdraw authority can kick the leader (the leader won't be kicked actually, but it will look like s/he was kicked) itemBindable checks if the item is bind-able GetMonsterRaceFlag returns the monster's race. (doesn't work probably if the monster have more than one flag) CItemData::GetLevelLimit returns the level limit of an item, 0 if there was not any level limit. And much more you find them out yourself... The solution has been upgraded to VS2017, hadn't much time to test it, but seems to be working well, a old not upgraded version will be attached as well Root: Fixed a lot of bugs with (uiinventory.py and uitooltip.py) Visual bug with the Change attributes item, if you placed it on a item that doesn't have any bonuses, it will be green. Same bug with Blessing Marble, now it will only be green if the item has 4 bonuses if the item has 4 of more bonuses, add attribute will have a red effect Bind and unbind working perfectly with right effects Deleted some of the unnecessary files Tried to move all localized text to locale_game, not sure if there's more. Now let me explain the upgradable guild NPCs, at the moment it's only the blacksmith. So there are 3 levels, as levels go up, the upgrade fees increase, and the succeeding rate go up as well. at Level 3, the blacksmith return 10% of the upgrade cost to the guild bank, of course only when the player is not a member of the blacksmith's guild. They are upgraded by a quest (which will be attached as well). if anyone need more explanation, I'm happy to explain it more. Other thing that I've changed dramatically is the New pet system. So the public version of the pet system, the time of the pet doesn't change unless the pet is summoned, and that doesn't make any sense. I've changed that so the timer will change even if the pet is not summoned. I've also changed the system that most of the data will be saved on the item, and less data will be queried form the DB each time the player summon the pet, it's not perfect, but it's better version, atleast for me. the number of skills will appear once you open the egg on the item, just like official. the timer of transportation box will not begin now until the pet is placed in it. and more information about the pet now appear on the transportation box. I was trying to communicate the pet's information using packets instead of commands, put didn't have the time to finish it. you will find the basis of it there, so you always can complete my job. I think I have mentioned everything, If I remember any more information, I will update the topic. Please note that the EterPack is changed, you can access them from here The Client is in Arabic language, so I don't think anyone will use it, but I'm gonna upload it anyway. I'll upload the root, locale and uiscript separately if anyone needed them. Downloads Server Source Client Source Client Virus Scans Cheers, Abood
  7. 3 points
    The textures of this water are ideally joined by no visible textures (seams). Colors are well matched to the climate of the metin. Download: You can find the link in the video description! If you want to see more of my work, look here: https://metin2dev.org/board/index.php?/topic/16751-3d-art-tatsumaru/
  8. 3 points
  9. 3 points
    Hello I'm Anohros, I'am a software- and game-developer and working on an game. It's a metin2 clone. I'm working on the player-controller at the moment: Game is developed with the Unreal Engine 4. With regards, Anohros
  10. 3 points
    binary/source/SpeedTreeLib/SpeedTreeForest.cpp Search and replace this function CSpeedTreeForest::SpeedTreeWrapperPtr CSpeedTreeForest::CreateInstance(float x, float y, float z, DWORD dwTreeCRC, const char * c_szTreeName) { SpeedTreeWrapperPtr pMainTree; if (!GetMainTree(dwTreeCRC, pMainTree, c_szTreeName)) { TraceError("CSpeedTreeForest::CreateInstance - Cannot find: %s", c_szTreeName); // 1 iunie 2018 return NULL; } SpeedTreeWrapperPtr pTreeInst = pMainTree->MakeInstance(); pTreeInst->SetPosition(x, y, z); pTreeInst->RegisterBoundingSphere(); return pTreeInst; }
  11. 3 points
    Here is the official-like version if someone interested in, yeah, I know, it's weird code. The official is in the CPythonCharacterManager class I think, I've put it into the CInstanceBase, and they use different map, but doesn't matter. I did some tests but I didn't stressed out in every situations, so I'm not sure this is safe enough to use. Oh, and I'm using it via python: Pseudo.c
  12. 3 points
    https://gyazo.com/feb2b32474c88856fba34fee8dfdba35 The gif shows everything
  13. 2 points
    Hello, here's a tutorial on how to update your MySQL Connector C (i think it's not supported anymore thanks oracle @.@) into MariaDB Connector C extracted from my source. You must need MariaDB, if you use MySQL with this connector don't ask help because it's not ment to be compatible. With this edit you could use MariaDB Connector v3.x without any problem. 1) Makefile update Open your libsql, db and game makefile and on the CFLAGS/IFLAGS add this: -I<your Extern source>/include/mariadb (ie.: ../Extern/include/mariadb) Also, if you have a -I referencing mysql please delete it Then, add this to your libsql, db and game CFLAGS this -D__MARIADB__ Finally, change on your db and game LIBS this -lmysqlclient into -lmariadbclient -lssl -lcrypto NOTE: If you already link libssl and libcrypto you can skip them NOTE ON 64BIT ENVIRONMENT: 2) Source Update Edit this code from libsql/AsyncSQL.h: #include <mysql/mysql.h> #include <mysql/errmsg.h> #include <mysql/mysqld_error.h> into: #ifdef __MARIADB__ #include <mariadb/mysql.h> #include <mariadb/errmsg.h> #include <mariadb/mysqld_error.h> #else #include <mysql/mysql.h> #include <mysql/errmsg.h> #include <mysql/mysqld_error.h> #endif Edit this code on db/DBManager.h #include <mysql/mysql.h> into this: #ifdef __MARIADB__ #include <mariadb/mysql.h> #else #include <mysql/mysql.h> #endif Finally, edit this file on libsql/AsyncSQL.cpp fprintf(stdout, "AsyncSQL: connected to %s (reconnect %d)\n", m_stHost.c_str(), m_hDB.reconnect); into: #ifdef __MARIADB__ fprintf(stdout, "AsyncSQL: connected to %s\n", m_stHost.c_str()); #else fprintf(stdout, "AsyncSQL: connected to %s (reconnect %d)\n", m_stHost.c_str(), m_hDB.reconnect); #endif 3) Database Server Update Now we're gonna replace the name "window" because MariaDB introduce the window operator that conflict with the query name What we will basicly do is change any "window" in query into "windows" db/AuctionManager.cpp function LoadAuctionItem() Replace: FROM item WHERE window = 'AUCTION' To: FROM item WHERE windows = 'AUCTION' db/ClientManagerPlayer.cpp Replace: ///////////////////////////////////////////// // 2) 아이템이 DBCache 에 없음 : DB 에서 가져옴 ///////////////////////////////////////////// else { snprintf(szQuery, sizeof(szQuery), "SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 " "FROM item%s WHERE owner_id=%d AND (window < %d or window = %d)", GetTablePostfix(), pTab->id, SAFEBOX, DRAGON_SOUL_INVENTORY); CDBManager::instance().ReturnQuery(szQuery, QID_ITEM, peer->GetHandle(), new ClientHandleInfo(dwHandle, pTab->id)); into: ///////////////////////////////////////////// // 2) 아이템이 DBCache 에 없음 : DB 에서 가져옴 ///////////////////////////////////////////// else { snprintf(szQuery, sizeof(szQuery), "SELECT id,windows+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 " "FROM item%s WHERE owner_id=%d AND (windows < %d or windows = %d)", GetTablePostfix(), pTab->id, SAFEBOX, DRAGON_SOUL_INVENTORY); CDBManager::instance().ReturnQuery(szQuery, QID_ITEM, peer->GetHandle(), new ClientHandleInfo(dwHandle, pTab->id)); Also replace: ClientHandleInfo * pkInfo = new ClientHandleInfo(dwHandle, packet->player_id); pkInfo->account_id = packet->account_id; CDBManager::instance().ReturnQuery(queryStr, QID_PLAYER, peer->GetHandle(), pkInfo); //-------------------------------------------------------------- // 아이템 가져오기 //-------------------------------------------------------------- snprintf(queryStr, sizeof(queryStr), "SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 " "FROM item%s WHERE owner_id=%d AND (window < %d or window = %d)", GetTablePostfix(), packet->player_id, SAFEBOX, DRAGON_SOUL_INVENTORY); CDBManager::instance().ReturnQuery(queryStr, QID_ITEM, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id)); Into: ClientHandleInfo * pkInfo = new ClientHandleInfo(dwHandle, packet->player_id); pkInfo->account_id = packet->account_id; CDBManager::instance().ReturnQuery(queryStr, QID_PLAYER, peer->GetHandle(), pkInfo); //-------------------------------------------------------------- // 아이템 가져오기 //-------------------------------------------------------------- snprintf(queryStr, sizeof(queryStr), "SELECT id,windows+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 " "FROM item%s WHERE owner_id=%d AND (windows < %d or windows = %d)", GetTablePostfix(), packet->player_id, SAFEBOX, DRAGON_SOUL_INVENTORY); CDBManager::instance().ReturnQuery(queryStr, QID_ITEM, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id)); Finally replace: snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), pi->player_id); delete CDBManager::instance().DirectQuery(queryStr); snprintf(queryStr, sizeof(queryStr), "DELETE FROM item%s WHERE owner_id=%d AND (window < %d or window = %d)", GetTablePostfix(), pi->player_id, SAFEBOX, DRAGON_SOUL_INVENTORY); delete CDBManager::instance().DirectQuery(queryStr); Into: snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), pi->player_id); delete CDBManager::instance().DirectQuery(queryStr); snprintf(queryStr, sizeof(queryStr), "DELETE FROM item%s WHERE owner_id=%d AND (windows < %d or windows = %d)", GetTablePostfix(), pi->player_id, SAFEBOX, DRAGON_SOUL_INVENTORY); delete CDBManager::instance().DirectQuery(queryStr); 4) Query update Design your player.item table, and change "window" to "windows". We have update into the new connector (mariadb connector c 3.x safetly), if you would like to downgrade change -lmariadbclient into -lmysqlclient, remove -D__MARIADB__ and change the -I referencing mariadb into mysql. Thanks for reading UPDATE: I've found other place to edit "window" into "windows" Open ClientManager.cpp From: else sys_log(0, "SAFEBOX id[%d] size[%d]", pSafebox->dwID, pSafebox->bSize); } if (0 == pSafebox->dwID) pSafebox->dwID = pi->account_id; pi->pSafebox = pSafebox; m2char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "SELECT id, window+0, pos, count, vnum, socket0, socket1, socket2, " "attrtype0, attrvalue0, " "attrtype1, attrvalue1, " "attrtype2, attrvalue2, " "attrtype3, attrvalue3, " "attrtype4, attrvalue4, " "attrtype5, attrvalue5, " "attrtype6, attrvalue6 " "FROM item%s WHERE owner_id=%d AND window='%s'", GetTablePostfix(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL"); To: else sys_log(0, "SAFEBOX id[%d] size[%d]", pSafebox->dwID, pSafebox->bSize); } if (0 == pSafebox->dwID) pSafebox->dwID = pi->account_id; pi->pSafebox = pSafebox; m2char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "SELECT id, windows+0, pos, count, vnum, socket0, socket1, socket2, " "attrtype0, attrvalue0, " "attrtype1, attrvalue1, " "attrtype2, attrvalue2, " "attrtype3, attrvalue3, " "attrtype4, attrvalue4, " "attrtype5, attrvalue5, " "attrtype6, attrvalue6 " "FROM item%s WHERE owner_id=%d AND windows='%s'", GetTablePostfix(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL"); From: else pItemAward->dwSocket0 = item_table->aLimits[i].lValue; break; } } } snprintf(szQuery, sizeof(szQuery), "INSERT INTO item%s (id, owner_id, window, pos, vnum, count, socket0, socket1, socket2) " "VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u)", GetTablePostfix(), GainItemID(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL", iPos, pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2); } To: else pItemAward->dwSocket0 = item_table->aLimits[i].lValue; break; } } } snprintf(szQuery, sizeof(szQuery), "INSERT INTO item%s (id, owner_id, windows, pos, vnum, count, socket0, socket1, socket2) " "VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u)", GetTablePostfix(), GainItemID(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL", iPos, pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2); } From: m_map_itemCache.erase(p->id); delete c; } m2char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, " "attrtype0, attrvalue0, " "attrtype1, attrvalue1, " "attrtype2, attrvalue2, " "attrtype3, attrvalue3, " "attrtype4, attrvalue4, " "attrtype5, attrvalue5, " "attrtype6, attrvalue6 " ") " "VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d" ")", GetTablePostfix(), p->id, p->owner, p->window, To: m_map_itemCache.erase(p->id); delete c; } m2char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "REPLACE INTO item%s (id, owner_id, windows, pos, count, vnum, socket0, socket1, socket2, " "attrtype0, attrvalue0, " "attrtype1, attrvalue1, " "attrtype2, attrvalue2, " "attrtype3, attrvalue3, " "attrtype4, attrvalue4, " "attrtype5, attrvalue5, " "attrtype6, attrvalue6 " ") " "VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d" ")", GetTablePostfix(), p->id, p->owner, p->window, UPDATE2: Open db/Cache.cpp and find: if (memcmp(aAttr, p->aAttr, sizeof(TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM)) isAttr = true; char szColumns[QUERY_MAX_LEN]; char szValues[QUERY_MAX_LEN]; char szUpdate[QUERY_MAX_LEN]; int iLen = snprintf(szColumns, sizeof(szColumns), "id, owner_id, window, pos, count, vnum"); int iValueLen = snprintf(szValues, sizeof(szValues), "%u, %u, %d, %d, %u, %u", p->id, p->owner, p->window, p->pos, p->count, p->vnum); int iUpdateLen = snprintf(szUpdate, sizeof(szUpdate), "owner_id=%u, window=%d, pos=%d, count=%u, vnum=%u", p->owner, p->window, p->pos, p->count, p->vnum); Replace into: if (memcmp(aAttr, p->aAttr, sizeof(TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM)) isAttr = true; char szColumns[QUERY_MAX_LEN]; char szValues[QUERY_MAX_LEN]; char szUpdate[QUERY_MAX_LEN]; int iLen = snprintf(szColumns, sizeof(szColumns), "id, owner_id, windows, pos, count, vnum"); int iValueLen = snprintf(szValues, sizeof(szValues), "%u, %u, %d, %d, %u, %u", p->id, p->owner, p->window, p->pos, p->count, p->vnum); int iUpdateLen = snprintf(szUpdate, sizeof(szUpdate), "owner_id=%u, windows=%d, pos=%d, count=%u, vnum=%u", p->owner, p->window, p->pos, p->count, p->vnum);
  14. 2 points
    Hello, This little thing is marks your pet seal into your inventory like the autopotion. This arrives with the v17.5 patch. Open PetSystem.cpp and replace or make it fit for you: void CPetActor::SetSummonItem(LPITEM pItem) { if (NULL == pItem) { LPITEM pSummonItem = ITEM_MANAGER::instance().FindByVID(m_dwSummonItemVID); if (NULL != pSummonItem) pSummonItem->SetSocket(1, FALSE); m_dwSummonItemVID = 0; m_dwSummonItemVnum = 0; return; } pItem->SetSocket(1, TRUE); m_dwSummonItemVID = pItem->GetVID(); m_dwSummonItemVnum = pItem->GetVnum(); } After that open the uiInventory.py and paste this code below the autopotion if-statement in the RefreshBagSlotWindow function. elif itemVnum >= 53001 and itemVnum <= 53256: metinSocket = [player.GetItemMetinSocket(globalSlotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]# <!> globalSlotNumber may be different <!> isActivated = 0 != metinSocket[1] if isActivated: self.wndItem.ActivateSlot(i) else: self.wndItem.DeactivateSlot(i)
  15. 2 points
    Hello, let's start! [15 Reactions == New Thread] 1- char_item.cpp Find for double ;; Yeah Monkeys, surprised XD? 2- On bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell) find: if (iWearCell < 0) return false; add below: //FIX BLOCK MARRIAGE ITEMS WHILE RIDING if (iWearCell == WEAR_BODY && IsRiding() && (item->GetVnum() >= 11901 && item->GetVnum() <= 11914)) //Marriage Armors { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("?????????????????????????????")); return false; } if (iWearCell == WEAR_WEAPON && IsRiding() && (item->GetVnum() == 50201)) //Marriage Weapon { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("?????????????????????????????")); return false; } 3- SMALL PREVENTS ON questlua_global.cpp int _clear_server_timer(lua_State* L) { CQuestManager & q = CQuestManager::instance(); const char * name = lua_tostring(L, 1); DWORD arg = (DWORD) lua_tonumber(L, 2); if (name && arg) q.ClearServerTimer(name, arg); else sys_err("LUA PREVENT: Wrong argument on ClearServerTimer!"); return 0; } int _char_log(lua_State * L) { CQuestManager& q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); DWORD what = 0; const char* how = ""; const char* hint = ""; if (lua_isnumber(L, 1)) what = (DWORD)lua_tonumber(L, 1); if (lua_isstring(L, 2)) how = lua_tostring(L, 2); if (lua_tostring(L, 3)) hint = lua_tostring(L, 3); if (ch) LogManager::instance().CharLog(ch, what, how, hint); else sys_err("LUA PREVENT: !ch on _char_log!"); return 0; } 4- FIX ISSUE ON WAR (Not for all sources, but you can put it also if you haven't the problem): find: battle_is_attackable on battle.cpp first IF for victim must be like this: if (victim->IsDead() || victim->IsObserverMode()) return false; second IF for Char must be like this: if (ch->IsStun() || ch->IsDead() || ch->IsObserverMode()) return false; Thx to read here, hope it'll be useful. Regards Hex
  16. 2 points
    Only 1 modification is neccessary in the GuildMarkUploader.cpp file in this funcition: CGuildMarkUploader::__Load: ilCopyPixels(0, 0, 0, SGuildMark::WIDTH, SGuildMark::HEIGHT, 1, IL_BGRA, IL_BYTE, (ILvoid*)m_kMark.m_apxBuf); The ILvoid isn't defined anymore in the il.h, so or you define it by yourself like the following way bellow or just change it to void. typedef void ILvoid;
  17. 2 points
    Heya, as title says it's party dice system self written (without CHAT_TYPE_DICE_INFO, it's up to you) https://i.imgur.com/sj3EZ64.gifv (sry for laggs - "wooden pc" ^^) You can test possibility of same score there: https://repl.it/@Nevisor/Dice-FORINFOR char_battle.cpp //find if (ch->GetParty()) ch = ch->GetParty()->GetNextOwnership(ch, GetX(), GetY()); //replace with if (ch->GetParty()) { ch = ch->GetParty()->GetNextOwnership(ch, GetX(), GetY()); #ifdef __ENABLE_DICE_SYSTEM__ ch = ch->GetParty()->Dice(ch, GetX(), GetY(), item->GetName()); #endif } party.cpp //at the end of file add #ifdef __ENABLE_DICE_SYSTEM__ LPCHARACTER CParty::Dice(LPCHARACTER ch, long x, long y, const char * szName) //item name { for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { if (it->second.pCharacter->GetDesc() && DISTANCE_APPROX(it->second.pCharacter->GetX() - x, it->second.pCharacter->GetY() - y) < PARTY_DEFAULT_RANGE) { ChatPacketToAllMember(CHAT_TYPE_DICE_INFO, "|cffffe6ba*** Rolling for the following item: %s ***", szName); while (1) { LPCHARACTER pkWinner; int iDice = 0; int iDraw = 0; for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it) if (it->second.pCharacter->GetDesc() && DISTANCE_APPROX(it->second.pCharacter->GetX() - x, it->second.pCharacter->GetY() - y) < PARTY_DEFAULT_RANGE) { int iScore = number(1, 10000); if (iScore == iDice) iDraw == iScore; else if (iDice == 0 || iScore > iDice) { pkWinner = it->second.pCharacter; iDice = iScore; } ChatPacketToAllMember(CHAT_TYPE_DICE_INFO, "|cffffe6ba*** ->\t\t\t\t\t%s - Dice score: %d ***", it->second.pCharacter->GetName(), iScore); } if (iDice != iDraw) { ChatPacketToAllMember(CHAT_TYPE_DICE_INFO, "|cffbb00ff*** Winner of the item %s is: %s ***", szName, pkWinner->GetName()); return pkWinner; } else { ChatPacketToAllMember(CHAT_TYPE_DICE_INFO, ""); ChatPacketToAllMember(CHAT_TYPE_DICE_INFO, "|cffffe6ba*** Rolling again for the following item: %s ***", szName); } } } } return ch; } #endif party.h //find void P2PSetMemberLevel(DWORD pid, BYTE level); //or bool IsPartyInDungeon(int mapIndex); //add bellow #ifdef __ENABLE_DICE_SYSTEM__ LPCHARACTER Dice(LPCHARACTER ch, long x, long y, const char * szName); #endif length.h enum EChatType { CHAT_TYPE_TALKING, /* 그냥 채팅 */ CHAT_TYPE_INFO, /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */ CHAT_TYPE_NOTICE, /* 공지사항 */ CHAT_TYPE_PARTY, /* 파티말 */ CHAT_TYPE_GUILD, /* 길드말 */ CHAT_TYPE_COMMAND, /* 일반 명령 */ CHAT_TYPE_SHOUT, /* 외치기 */ CHAT_TYPE_WHISPER, CHAT_TYPE_BIG_NOTICE, CHAT_TYPE_MONARCH_NOTICE, #ifdef __ENABLE_DICE_SYSTEM__ CHAT_TYPE_DICE_INFO, #endif CHAT_TYPE_MAX_NUM };
  18. 2 points
    // PythonNetworkStreamPhaseGame.cpp // Under bool CPythonNetworkStream::SendClientVersionPacket() from // add bool CPythonNetworkStream::SendClientVersionPacketNew(int32_t arg) { auto ver_arg = std::to_string(arg); std::string filename; GetExcutedFileName(filename); filename = CFileNameHelper::NoPath(filename); CFileNameHelper::ChangeDosPath(filename); TPacketCGClientVersion kVersionPacket; kVersionPacket.header = HEADER_CG_CLIENT_VERSION; strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename) - 1); strncpy(kVersionPacket.timestamp, ver_arg.c_str(), sizeof(kVersionPacket.timestamp) - 1); if (!Send(sizeof(kVersionPacket), &kVersionPacket)) { Tracef("SendClientReportPacket Error"); } return true; } //PythnNetworkStram.h // bool SendClientVersionPacket(); Under // add bool SendClientVersionPacketNew(int32_t arg); // PythonNetwoStramModule.cpp PyObject* netSendCheckVersionPacket(PyObject* poSelf, PyObject* poArgs) { int32_t iVer; if (!PyTuple_GetInteger(poArgs, 0, &iVer)) { return Py_BuildException(); } CPythonNetworkStream &rns = CPythonNetworkStream::Instance(); rns.SendClientVersionPacketNew(iVer); return Py_BuildNone(); } // static PyMethodDef s_methods[] = { "SendVersionPacket", netSendVersionPacket, METH_VARARGS }, Python usage def IsVersion(self, arg) net.SendClientVersionPacket(arg) if IsVersion(1111) #Do stuff I did not test it.
  19. 2 points
    Hi Dev`s here my new Multi Kill System. [Project] Angel vs Demon. [System] Multi Kill - Effects & Sounds.
  20. 2 points
    Enumeration must be identical in client / server / SQL/ dump_proto Example of a wrong enumeration OF source. enum Server : std::uint8_t { POINT_WOLFMAN, // OK POINT_WARRIOR, // OK } enum Client : std::uint8_t { POINT_WARRIOR, // WRONG POINT_WOLFMAN, // WRONG } Example of a correct enumeration. enum Server : std::uint8_t { POINT_WOLFMAN, // OK POINT_WARRIOR, // OK } enum client : std::uint8_t { POINT_WOLFMAN, // OK POINT_WARRIOR, // OK } Read more about how enum works here. https://en.cppreference.com/w/cpp/language/enum Most likely, I think you fucked the dump_proto enumerations. Example of wrong dump_proto enumeration. //Dump_proto int get_Item_ApplyType_Value(string inputString) { string arApplyType[] = { "APPLY_WOLFMAN", // ok "APPLY_BLEEDING", // ok }; int retInt = -1; // ProtoReader.cpp int get_Item_ApplyType_Value(std::string inputString) { std::string arApplyType[] = { "APPLY_BLEEDING", // wrong "APPLY_WOLFMAN", // wrong }; int retInt = -1; Check also the SQL enumeration order, from item_attr
  21. 1 point
    You might want to post the quest too so we can see what is actually going on.
  22. 1 point
    char szQuery[QUERY_MAX_LEN]; snprintf(szQuery, sizeof(szQuery), "SELECT infernus FROM player.player WHERE name='%s'", GetName()); std::unique_ptr<SQLMsg> pSelectMsg(DBManager::instance().DirectQuery(szQuery); SQLResult* pRes = pSelectMsg->Get(); if (pRes->uiNumRows > 0) { MYSQL_ROW row = mysql_fetch_row(pRes->pSQLResult); DWORD GetVal = 0; str_to_number(GetVal, row[0]); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Total count is %d"), GetVal); } It should work now.
  23. 1 point
    Thanks for nothing this time. Solved myself editing item.cpp like this: #if defined __WEAPON_COSTUME_SYSTEM__ && !defined __CHANGELOOK_SYSTEM__ else if (GetSubType() == COSTUME_WEAPON) { toSetPart = PART_WEAPON; if (!bAdd) { const CItem* pWeapon = m_pOwner->GetWear(WEAR_WEAPON); toSetValue = (NULL != pWeapon) ? pWeapon->GetVnum() : m_pOwner->GetPart(PART_WEAPON); } } #endif #if defined __WEAPON_COSTUME_SYSTEM__ && defined __CHANGELOOK_SYSTEM__ else if (GetSubType() == COSTUME_WEAPON) { toSetPart = PART_WEAPON; if (!bAdd) { const CItem* pWeapon = m_pOwner->GetWear(WEAR_WEAPON); if(NULL != pWeapon) { if(pWeapon->GetTransmutation() != 0) toSetValue = pWeapon->GetTransmutation(); else toSetValue = pWeapon->GetVnum(); } } } #endif
  24. 1 point
    In game active code: /x 1 DOWNLOAD VIRUS TOTAL
  25. 1 point
    thx bro + .." "and fotball ahah
×