Jump to content

xP3NG3Rx

Honorable Member
  • Posts

    839
  • Joined

  • Days Won

    393
  • Feedback

    100%

Everything posted by xP3NG3Rx

  1. I thought so that the problem will be the unused wear positions, anyway thanks! Finished ^^
  2. Interesting O.o I'm trying to extend the ViewEquipment with costumes, rings and belt, but I get packet error when I call it. Phase Game does not handle this header (header: 204, last: 99, 204) wtf? HEADER_GC_HS_REQUEST = 204, The window opens and fill up the slots with items without rings and belt and than I get that packet header error. Okay, challenge accepted .
  3. Could you explain it? Because -> link (Slow internet 32kbps T_T) I know this bug, and I fixxed this 4 month ago Prewritten txt with pictures: ds fix.7z But the problem is the SItemPos struct in common/length.h. Here is the fixxed: typedef struct SItemPos { BYTE window_type; WORD cell; SItemPos () { window_type = INVENTORY; cell = WORD_MAX; } SItemPos (BYTE _window_type, WORD _cell) { window_type = _window_type; cell = _cell; } bool IsValidItemPosition() const { switch (window_type) { case RESERVED_WINDOW: return false; case INVENTORY: case EQUIPMENT: case BELT_INVENTORY: return cell < INVENTORY_AND_EQUIP_SLOT_MAX; case DRAGON_SOUL_INVENTORY: return cell < (DRAGON_SOUL_INVENTORY_MAX_NUM); // µżŔűŔ¸·Î Ĺ©±â°ˇ Á¤ÇŘÁö´Â window´Â valid ĂĽĹ©¸¦ ÇŇ Ľö°ˇ ľř´Ů. case SAFEBOX: case MALL: return false; default: return false; } return false; } bool IsEquipPosition() const { return (IsDefaultInventoryEquipPosition() || IsDragonSoulEquipPosition()); } bool IsDefaultInventoryEquipPosition() const { return ((INVENTORY == window_type || EQUIPMENT == window_type) && cell >= INVENTORY_MAX_NUM && cell < INVENTORY_MAX_NUM + WEAR_MAX_NUM); } bool IsDragonSoulEquipPosition() const { return ((INVENTORY == window_type || EQUIPMENT == window_type) && cell >= DRAGON_SOUL_EQUIP_SLOT_START && cell < DRAGON_SOUL_EQUIP_SLOT_END); } bool IsBeltInventoryPosition() const { return ((INVENTORY == window_type) && cell >= BELT_INVENTORY_SLOT_START && cell < BELT_INVENTORY_SLOT_END); } bool IsDefaultInventoryPosition() const { return ((INVENTORY == window_type) && cell < INVENTORY_MAX_NUM); } bool operator==(const struct SItemPos& rhs) const { return (window_type == rhs.window_type) && (cell == rhs.cell); } bool operator<(const struct SItemPos& rhs) const { return (window_type < rhs.window_type) || ((window_type == rhs.window_type) && (cell < rhs.cell)); } } TItemPos; Me works
  4. With the original exchange.cpp file will not show "succes" when the target's inventory is full.
  5. Yuri Alexeev - Requiem For A Dream (Original Mix) ~ This is my ringtone too :3 David Correy feat. Chris Johnson - Live Your Life
  6. The source of problem is a function which check the exchanging ppl empty spaces in the inventory. bool CExchange::CheckSpace()
  7. View-Equipment? That is not bug, just not implemented.
  8. Your converted protos are crap. Why? Simple: // vnum ą× vnum range Ŕбâ. { std::string s(csvTable.AsStringByIndex(0)); int pos = s.find("~"); // vnum Çʵ忡 '~'°ˇ ľř´Ů¸é ĆĐ˝ş if (std::string::npos == pos) { itemTable->dwVnum = dataArray[0]; itemTable->dwVnumRange = 0; } else { std::string s_start_vnum (s.substr(0, pos)); std::string s_end_vnum (s.substr(pos +1 )); int start_vnum = atoi(s_start_vnum.c_str()); int end_vnum = atoi(s_end_vnum.c_str()); if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum)) { sys_err ("INVALID VNUM %s", s.c_str()); return false; } itemTable->dwVnum = start_vnum; itemTable->dwVnumRange = end_vnum - start_vnum; // HERE YOUR TXT FAIL } } Thanks Sanchez.
  9. Jesus Christ. AppendTextLine is a method of uiTooltip.Tooltip() class object. You can use two methods of TextLine to make a colored line: class TextLine(Window): def SetFontColor(self, red, green, blue): wndMgr.SetFontColor(self.hWnd, red, green, blue) def SetPackedFontColor(self, color): wndMgr.SetFontColor(self.hWnd, color) The packed color is that what the grp module can generate to you with the GenerateColor method. For example(lightgreen): packed_color = grp.GenerateColor(105./255, 1., 75./255, 1.) Usage: text = ui.TextLine() #text.SetParent(self) text.SetDefaultFontName() text.SetPosition(16, 77) text.SetPackedFontColor(grp.GenerateColor(105./255, 1., 75./255, 1.)) #text.SetFontColor(105/255., 255./255, 75./255) text.SetText("This is a green message") text.Show()
  10. xP3NG3Rx

    Siege War

    Here it is: siegewar.tga.7z
  11. Doesn't work for me :S First start Second start It pisses me off when I restart my PC I can start the db again by once. It's works! I forgot to save the AsyncSQL.cpp file changes in Notepad++ x'Đ
  12. I think the capoeira costumes is not a new "product" of ymir 'coz the filenames of hairstyles are hair_12.gr2, anyway here are the official icons of capoeira costumes + item_proto.txt: [Hidden Content] ps.: I have not the tooltip images of hairstyles :S (icon/hair/*.sub ;*.tga)
  13. M2 Download Center Download Here ( Internal ) Hi m2dev, I release my modifications of game core. 0x01.) Here are "some" new questfunctions to you ^^ If either of them is already public I'm sorry ? but these works perfectly. A short list of them: * Item module: - get_flag | Return: Integer | Args: None - get_wearflag | Return: Integer | Args: None - get_antiflag | Return: Integer | Args: None - has_antiflag | Return: Boolean | Args: int Antiflag - get_refine_set | Return: Integer | Args: None - get_limit | Return: Table1 | Args: byte LimitIndex[0..1] - get_apply | Return: Table1 | Args: byte ApplyIndex[0..2] - get_applies | Return: Table2 | Args: None - get_refine_materials | Return: Table3 | Args: None - get_addon_type | Return: Integer | Args: None - dec | Return: Nil | Args: None or byte Count - inc | Return: Nil | Args: None or byte Count - add_attribute | Return: Boolean | Args: None - get_attribute | Return: Table1 | Args: byte AttrIndex[0..4] - set_attribute | Return: Boolean | Args: byte AttrIndex[0..4], byte AttrType[1..94], short AttrValue[-32768..32767] - change_attribute | Return: Boolean | Args: None - add_rare_attribute | Return: Boolean | Args: None - get_rare_attribute | Return: Table1 | Args: byte AttrIndex[0..1] - set_rare_attribute | Return: Boolean | Args: byte AttrIndex[0..1], byte AttrType[1..94], short AttrValue[-32768..32767] - change_rare_attribute | Return: Boolean | Args: None - equip | Return: Boolean | Args: byte EquipCell[0..32] - set_count | Return: Nil | Args: byte/short Count(short with increased item stack number) Returning item table-structures: Table1 = { -- Type, Value 1, 2000 } Table2 = { -- [idx] = {Type, Value} -- Triton sword+9: [0] = { 7, 30 }, [1] = { 22, 12 }, [2] = { 17, 12 } } Table3 = { -- Poison sword+8(refineSet:27): material_count = 2, materials = { -- { Vnum, Count } { 30091, 2 }, { 27994, 1 } }, cost = 150000, prob = 10, } * NPC module: - get_level | Return: Integer | Args: None - get_name | Return: String | Args: None - get_type | Return: Byte | Args: None - get_rank | Return: Byte | Args: None - is_metin | Return: Boolean | Args: None - is_boss | Return: Boolean | Args: None - show_effect_on_target | Return: Boolean | Args: string EffectRealPath - get_ip | Return: String | Args: None - get_client_version | Return: String | Args: None - get_job | Return: Byte | Args: None - get_pid | Return: Integer | Args: None - get_exp | Return: Long | Args: None * PC module: - get_mount_vnum | Return: Integer | Args: None - get_point | Return: Integer | Args: byte PointNumber - get_real_point | Return: Integer | Args: byte PointNumber - show_effect | Return: Boolean | Args: string EffectRealPath - disconnect_with_delay | Return: Nil | Args: int Delay - get_max_level | Return: Integer | Args: None - get_ip | Return: String | Args: None - get_client_version | Return: String | Args: None - kill | Return: Nil | Args: None * Game module: - drop_item_and_select | Return: Nil | Args: int Vnum, byte/short Count=1, bool HasOwnership=false, short OwnershipTime=180 Example call: game.drop_item_and_select(19, 1, true, 30); item.set_attribute(0, apply.CRITICAL_PCT, 10) * Pet module: - is_mine | Return: Boolean | Args: None * Global: - purge_vid | Return: Nil | Args: int Vid Here are the codes: questlua_item.cpp questlua_npc.cpp questlua_pc.cpp questlua_game.cpp questlua_pet.cpp questlua_global.cpp 0x02.) Two GM commands: - "/kill_all" -> Kill all players inside your view-range/horizon - "/drop_item" -> Drop an item from arg1, or drop all items from range(arg1, arg2) Commands: Clientside version of kill_all: 0x03.) refine_proto reloading without server restart. Extend your "/reload Proto" command with the refine_proto reloading with this code parts: - Open your db/src/ClientManager.cpp file and replace your "void CClientManager::QUERY_RELOAD_PROTO()" function to this: void CClientManager::QUERY_RELOAD_PROTO() { if (!InitializeTables()) { sys_err("QUERY_RELOAD_PROTO: cannot load tables"); return; } for (TPeerList::iterator i = m_peerList.begin(); i != m_peerList.end(); ++i) { CPeer * tmp = *i; if (!tmp->GetChannel()) continue; tmp->EncodeHeader(HEADER_DG_RELOAD_PROTO, 0, sizeof(WORD) + sizeof(TSkillTable) * m_vec_skillTable.size() + sizeof(WORD) + sizeof(TBanwordTable) * m_vec_banwordTable.size() + sizeof(WORD) + sizeof(TItemTable) * m_vec_itemTable.size() + sizeof(WORD) + sizeof(TMobTable) * m_vec_mobTable.size() + sizeof(WORD) + sizeof(TRefineTable) * m_iRefineTableSize); tmp->EncodeWORD(m_vec_skillTable.size()); tmp->Encode(&m_vec_skillTable[0], sizeof(TSkillTable) * m_vec_skillTable.size()); tmp->EncodeWORD(m_vec_banwordTable.size()); tmp->Encode(&m_vec_banwordTable[0], sizeof(TBanwordTable) * m_vec_banwordTable.size()); tmp->EncodeWORD(m_vec_itemTable.size()); tmp->Encode(&m_vec_itemTable[0], sizeof(TItemTable) * m_vec_itemTable.size()); tmp->EncodeWORD(m_vec_mobTable.size()); tmp->Encode(&m_vec_mobTable[0], sizeof(TMobTable) * m_vec_mobTable.size()); tmp->EncodeWORD(m_iRefineTableSize); tmp->Encode(m_pRefineTable, sizeof(TRefineTable) * m_iRefineTableSize); } } - Then open game/src/refine.cpp and replace this function: "bool CRefineManager::Initialize(TRefineTable * table, int size)" to this: bool CRefineManager::Initialize(TRefineTable * table, int size) { if (!m_map_RefineRecipe.empty()) m_map_RefineRecipe.clear(); for (int i = 0; i < size; ++i, ++table) { sys_log(0, "REFINE %d prob %d cost %d", table->id, table->prob, table->cost); m_map_RefineRecipe.insert(std::make_pair(table->id, *table)); } sys_log(0, "REFINE: COUNT %d", m_map_RefineRecipe.size()); return true; } - If you are done with these, open game/src/input_db.cpp and extend this event "void CInputDB::ReloadProto(const char * c_pData)" with this: /* * REFINE */ wSize = decode_2bytes(c_pData); c_pData += 2; sys_log(0, "RELOAD: REFINE: %d", wSize); if (wSize) { CRefineManager::instance().Initialize((TRefineTable *) c_pData, wSize); c_pData += wSize * sizeof(TRefineTable); } - Done. 0x04.) kill quest trigger fix (when kill / when race.kill) With this change you can use every kill methods with mobs and players and runs by once per kills. Examples: when 101.kill begin -> Works when you are killing Wild dogs. when kill begin -> Works with mobs and players too. when kill with npc.is_pc() begin -> Works with players only. when kill with npc.is_pc() == false begin -> Works with monsters only. when kill with npc.get_race() == 102 begin -> Works when you hunt Wolf. I tested with these codes: when kill begin if npc.is_pc() then chat("kill pc") end if npc.get_race() > 100 then chat("kill by race: "..tostring(npc.race)) end end when kill with npc.is_pc() begin chat("kill with npc.is_pc") end when kill with npc.get_race() == 102 begin chat("kill with npc.get_race 102") end when 101.kill begin chat("101.kill") end Follow these steps to fix it: - Open game/src/questmanager.h and search for this: "void Kill(unsigned int pc, unsigned int npc);" replace to: "void Kill(unsigned int pc, unsigned int npc, unsigned int pc2 = 0);" - Save&Close, open game/src/questmanager.cpp and search this function: "void CQuestManager::Kill(unsigned int pc, unsigned int npc)" - and replace to this: void CQuestManager::Kill(unsigned int pc, unsigned int npc, unsigned int pc2) { //m_CurrentNPCRace = npc; PC * pPC; sys_log(0, "CQuestManager::Kill QUEST_KILL_EVENT (pc=%d, npc=%d, pc2=%d)", pc, npc, pc2); if ((pPC = GetPC(pc))) { if (!CheckQuestLoaded(pPC)) return; /* [hyo] ¸÷ kill˝Ă Áßşą Ä«żîĆĂ ŔĚ˝´ °ü·ĂÇŃ ĽöÁ¤»çÇ× quest scriptżˇ when 171.kill begin ... µîŔÇ ÄÚµĺ·Î ŔÎÇĎż© ˝şĹ©¸łĆ®°ˇ Ăł¸®µÇľú´ő¶óµµ ąŮ·Î returnÇĎÁö ľĘ°í ´Ů¸Ą °Ë»çµµ ĽöÇŕÇϵµ·Ď şŻ°ćÇÔ. (2011/07/21) */ // call script if (npc > 0 && pc2 == 0) m_mapNPC[npc].OnKill(*pPC); LPCHARACTER ch = GetCurrentCharacterPtr(); LPPARTY pParty = ch->GetParty(); LPCHARACTER leader = pParty ? pParty->GetLeaderCharacter() : ch; if (leader) { m_pCurrentPartyMember = ch; if (m_mapNPC[npc].OnPartyKill(*GetPC(leader->GetPlayerID()))) return; pPC = GetPC(pc); } LPCHARACTER victim = CHARACTER_MANAGER::instance().FindByPID(pc2); if (victim && victim->IsPC() && m_mapNPC[QUEST_NO_NPC].OnKill(*pPC)) return; else if (m_mapNPC[QUEST_NO_NPC].OnKill(*pPC)) return; if (leader) { m_pCurrentPartyMember = ch; m_mapNPC[QUEST_NO_NPC].OnPartyKill(*GetPC(leader->GetPlayerID())); } } else sys_err("QUEST: no such pc id : %d", pc); } - Save&Close, open game/src/char_battle.cpp and search this call: "quest::CQuestManager::instance().Kill(pkKiller->GetPlayerID(), quest::QUEST_NO_NPC)" - and replace to this: "quest::CQuestManager::instance().Kill(pkKiller->GetPlayerID(), quest::QUEST_NO_NPC, GetPlayerID());" - Done. 0x05.) ImmuneBug fix. I know there are some fixes but this is a working solution.. Everything inside two functions into item.cpp file by names: "CItem::EquipTo" and "CItem::Unequip". Every two functions are containing this sh*!&t: DWORD dwImmuneFlag = 0; for (int i = 0; i < WEAR_MAX_NUM; ++i) if (m_pOwner->GetWear(i)) SET_BIT(dwImmuneFlag, m_pOwner->GetWear(i)->m_pProto->dwImmuneFlag); m_pOwner->SetImmuneFlag(dwImmuneFlag); Hm, you have to replace those to this: DWORD dwImmuneFlag = 0; LPITEM item = NULL; for (int i = 0; i < WEAR_MAX_NUM; ++i) { if (item=m_pOwner->GetWear(i)) { if (item->GetImmuneFlag() != 0) SET_BIT(dwImmuneFlag, item->GetImmuneFlag()); if (item->GetAttributeCount() > 0) { if (item->HasAttr(APPLY_IMMUNE_STUN)) SET_BIT(dwImmuneFlag, IMMUNE_STUN); if (item->HasAttr(APPLY_IMMUNE_SLOW)) SET_BIT(dwImmuneFlag, IMMUNE_SLOW); if (item->HasAttr(APPLY_IMMUNE_FALL)) SET_BIT(dwImmuneFlag, IMMUNE_FALL); } } } m_pOwner->SetImmuneFlag(dwImmuneFlag); - Done. 0x06.) Finished uiQuest.py selection by keyboard-usage with "Next" and "Prev" buttons. Test-example: when 9010.chat."TEST selection pages" begin local sTab = { "01","02","03","04","05","06","07","08","09","10", "11","12","13","14","15","16","17","18","19","20", "Exit"--to make exit by Escape key } local s=select_table(sTab) if s==table.getn(sTab) then return end chat("You'r choice: sTab["..tostring(s).."] -> "..sTab[s]) end Here you can download the full uiquest.py file from my client: Download 0x07.) Little SQL-Script: SELECT log.log.time AS "When", player.player.`name` AS Who, log.log.how AS WhatDid, log.log.what AS ItemID, log.log.vnum AS ItemVnum, player.item_proto.locale_name AS ItemName, player.item.count AS Count, player.item.Socket0, player.item.Socket1, player.item.Socket2, player.item.AttrType0, player.item.AttrValue0, player.item.AttrType1, player.item.AttrValue1, player.item.AttrType2, player.item.AttrValue2, player.item.AttrType3, player.item.AttrValue3, player.item.AttrType4, player.item.AttrValue4, player.item.AttrType5, player.item.AttrValue5, player.item.AttrType6, player.item.AttrValue6 FROM log.log INNER JOIN player.player ON log.log.who = player.player.id INNER JOIN player.item ON log.log.what = player.item.id INNER JOIN player.item_proto ON log.log.vnum = player.item_proto.vnum WHERE log.how in ("EXCHANGE_GIVE", "EXCHANGE_TAKE", "DROP", "SAFEBOX PUT", "SAFEBOX GET", "DEAD_DROP") AND player.`name` = "Xeriesey"; * You have to give a name where you can see Xeriesey ^-^ Result of query: I hope you like it. If you have any questions or find an error/mistake, just post a message into this thread and I will try to make answer when I'll be online. ps.: Sorry for my bad English. "(" + "c" + ")" == © -> F**k Changelog: - 2014.09.22. 16:29 / 04:29 PM ~ Added forgotten include to questlua_npc.cpp. - 2014.09.22. 16:48 / 04:48 PM ~ Added more forgotten things :S - 2014.09.27. 13:08 / 01:08 PM ~ SQL syntax fix With Regards, P3NG3R
  14. I have the SF and the client, but I can't upload it, sorry. Here you can find the quets: [Hidden Content] Why? 'Coz I have no internet at home.(I did not want to post again with off.)
  15. The 4th one is not linked with the story, It's a new story line, new cast , new everything! It is true, but I wanted to refresh my memory. Last movie what I saw: Divergent
  16. Currently I am watching the Trasnformers trilogy because the 4th episode is coming and I do not remember the story The last movie what I saw the (Booooring)"Gravity".
  17. And do not forget the skills are. chat_skill.cpp: bool CHARACTER::CanUseSkill(DWORD dwSkillVnum) const
  18. 25040 Blessing Scroll Reduces the risk of destroying an Item if the upgrade fails. The cost of this save is that the quality is reduced by 1 point. 71032 Dragon Scroll Eliminates the risk of destroying an item if the improvement fails. Only its quality will be decreased by 1. Additionally, the probability of a successful improvement will increase by 10%. Do you see the differences? Those lines from .UK client. And here is from .DE: 25040 Segensschriftrolle Beseitigt das Risiko, einen Gegenstand zu zerstören, wenn seine Verbesserung fehlschlägt. In diesem Fall wird lediglich seine Qualität um 1 verringert. 71032 Schriftrolle des Drachen Beseitigt das Risiko, einen Gegenstand zu zerstören, wenn seine Verbesserung fehlschlägt. Es wird nur die Qualität um eine Stufe verringert. Zudem erhöht sich die Wahrscheinlichkeit einer erfolgreichen Verbesserung um 10 %. Your modification removes the blessing scorlls. Do you understand?
  19. In the original case the Blessing Scroll does not raise the successful rate. The Dragon's Scroll is raising the rate with 10%.
  20. In the original case the game handle in minutes. If you apply a dif with 0x01 that will be 1 minute, the 0x0F is 15 minutes. But here is the dif for switching time in seconds: This difference file is created by The Interactive Disassembler game_r34083_32_internal_ip Delay value in sec (15s) 0005ECA3: 0A 0F 0005ECA4: 00 00 Variable fix 0005ECED: 89 8B 0005ECEE: C1 F0 Remove: Division 60 0005ECFB: 8D 90 0005ECFC: 34 90 0005ECFD: 0A 90 0005ECFE: C1 90 0005ECFF: FE 90 0005ED00: 05 90 0005ED01: C1 90 0005ED02: F9 90 0005ED03: 1F 90 0005ED04: 29 90 0005ED05: CE 90 And you can modify it with the "change_itemattr_cycle" event flag if the value of the flag higher than the defined in the game. And try with a player character not with a gm because the GMs can switch without waiting time.
  21. Thanks, but those pets are already pub since a year ago from .KR client I think. Next time you post it in here: [Hidden Content]
  22. "set percent for skillbook sucess" - It will be better if that configurable with event_flag.
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.