dexoluss 0 Posted June 20 Share Posted June 20 Hey would anyone be kind and help me with quest for pets? I have this quest but every time i die or teleport the pet is missing.. I know that i should set somewhere questflag but i dont know where.. I tried it few times but i wasnt able to set it up.. thanks -- -- PET_SYSTEM begin -- gameforge.pet_system = {} -- gameforge.pet_system._030_chat = "Non puoi ancora evocare questo pet " -- gameforge.pet_system.petname_34001 = " - Fenice di fuoco " -- gameforge.pet_system.petname_34002 = " - Cucciolo di Renna " -- gameforge.pet_system.petname_34003 = " - Fenice di Ghiaccio " -- gameforge.pet_system.petname_34004 = " - Piccolo Azrael " -- gameforge.pet_system.petname_34005 = " - Porky " -- gameforge.pet_system.petname_34006 = " - Rufus " -- gameforge.pet_system.petname_34007 = " - Khan " -- gameforge.pet_system.petname_34008 = " - Leonida " -- gameforge.pet_system.petname_34009 = " - Piccolo Azrael(oro) " -- gameforge.pet_system.petname_34010 = " - Bambi " -- gameforge.pet_system.petname_34011 = " - Knuud " -- gameforge.pet_system.petname_34012 = " - Bao Bao " -- gameforge.pet_system.petname_34013 = " - Miniboia Grassoccio (nero) " -- gameforge.pet_system.petname_34014 = " - Miniboa Grassoccio (oro) " -- gameforge.pet_system.petname_34015 = " - Boney " -- gameforge.pet_system.petname_34016 = " - Fenice di Giada " -- gameforge.pet_system.petname_34017 = " - Porky Polare " -- gameforge.pet_system.petname_34018 = " - Rufus Gelido " -- gameforge.pet_system.petname_34019 = " - Khan dell'Artide " -- gameforge.pet_system.petname_34020 = " - Leonida da Neve " -- gameforge.pet_system.petname_34021 = " - Sheldon " -- gameforge.pet_system.petname_34022 = " - Cooper " -- gameforge.pet_system.petname_34023 = " - Baby Pantera " -- gameforge.pet_system.petname_34024 = " - Baby Leopardo " -- gameforge.pet_system.petname_34026 = " - Testa di zucca " -- gameforge.pet_system.petname_34027 = " - Scopa volante " -- gameforge.pet_system.petname_34028 = " - Fiocchetto " -- gameforge.pet_system.petname_34029 = " - Campanellino " -- gameforge.pet_system.petname_34030 = " - Dio dell'Amore " -- gameforge.pet_system.petname_34031 = " - Cuore Furioso " -- gameforge.pet_system.petname_34032 = " - Mezzaluna Rossa " -- gameforge.pet_system.petname_34033 = " - Mezzaluna Blu " -- gameforge.pet_system.petname_34034 = " - Pecorella bianca " -- gameforge.pet_system.petname_34035 = " - Montone Blu " -- gameforge.pet_system.petname_34039 = " - Piccolo Huashin " -- gameforge.pet_system.petname_34055 = " - Bruce " -- gameforge.pet_system.petname_34056 = " - Wayne " -- gameforge.pet_system.petname_34057 = " - Robin " -- gameforge.pet_system.petname_34058 = " - Valentino " -- gameforge.pet_system.petname_34059 = " - Valentinia " -- gameforge.pet_system.petname_34060 = " - Valentino+ " -- gameforge.pet_system.petname_34061 = " - Valentinia+ " -- gameforge.pet_system.petname_34062 = " - Lanterna lunare (ar) " -- gameforge.pet_system.petname_34063 = " - Lanterna lunare (blu) " -- gameforge.pet_system.petname_34066 = " - Bonsai " -- gameforge.pet_system.petname_34066p = " - Bonsai+ " -- gameforge.pet_system.petname_34066pp = " - +Bonsai+ " -- gameforge.pet_system.petname_34067 = " - Signora Jiangshi+ " -- gameforge.pet_system.petname_34068 = " - Signor Jiangshi+ " -- gameforge.pet_system.petname_34069 = " - Jiangshi Junior " -- gameforge.pet_system.petname_34070 = " - Elfo Rosso " -- gameforge.pet_system.petname_34071 = " - Elfo Verde " -- gameforge.pet_system.petname_34084 = " - Donnie " -- gameforge.pet_system.petname_34085 = " - Frank " -- gameforge.pet_system.petname_34006 = " - Rufus " -- gameforge.pet_system.petname_8590 = " - bunny " -- gameforge.pet_system.petname_8591 = " - girl " -- gameforge.pet_system.petname_8592 = " - mafia " -- gameforge.pet_system.petname_8594 = " - booo " -- gameforge.pet_system.petname_8595 = " - maister " -- gameforge.pet_system.petname_8597 = " - tygrys " -- -- PET_SYSTEM end quest pet_system begin state start begin function get_pet_info(itemVnum) if pet_system.pet_info_map==nil then pet_system.pet_info_map = { -- [ITEM VNUM] MOB_VNUM, DEFAULT NAME [53001] = {34001, gameforge.pet_system.petname_34001, 0}, -- no bonus 120giorni [53002] = {34002, gameforge.pet_system.petname_34002, 0}, -- +1500 HP e +15% danno, Permette di droppare le calze se lo si tiene al proprio fianco mentre si uccidono mob. 20giorni [53003] = {34003, gameforge.pet_system.petname_34003, 0}, -- no bonus 120giorni [53005] = {34004, gameforge.pet_system.petname_34004, 0}, -- +1500 HP e +15% di danno, se il PG si trova dal 2° piano della Torre dei Demoni in su, o se si trova all'interno delle Catacombe del Diavolo 30giorni [53006] = {34009, gameforge.pet_system.petname_34009, 0}, -- +1500 HP e +15% di danno, se il PG si trova dal 2° piano della Torre dei Demoni in su, o se si trova all'interno delle Catacombe del Diavolo 200giorni(non implementato sull offy ma c'è) [53007] = {34010, gameforge.pet_system.petname_34010, 0}, -- +1500 HP e +15% danno, Permette di droppare le calze se lo si tiene al proprio fianco mentre si uccidono mob. 20giorni [53008] = {34011, gameforge.pet_system.petname_34011, 0}, -- +1500 HP e +15% di danno 30giorni [53009] = {34012, gameforge.pet_system.petname_34012, 0}, -- +1500 HP e +15% di danno 30giorni [53010] = {34008, gameforge.pet_system.petname_34008, 0}, -- +1500 HP e +15% di danno 30giorni [53011] = {34007, gameforge.pet_system.petname_34007, 0}, -- +1500 HP e +15% di danno 120giorni [53012] = {34005, gameforge.pet_system.petname_34005, 0}, -- +15% danno e +1500 HP 30giorni [53013] = {34006, gameforge.pet_system.petname_34006, 0}, -- +1500 HP e +15% di danno 30giorni [53014] = {34013, gameforge.pet_system.petname_34013, 0}, -- +1500 HP e +15% di danno 30giorni [53015] = {34014, gameforge.pet_system.petname_34014, 0}, -- +1500 HP e +15% di danno 30giorni [53016] = {34015, gameforge.pet_system.petname_34015, 0}, -- +1500 HP e +15% di danno 30giorni [53017] = {34016, gameforge.pet_system.petname_34016, 0}, -- +30% di Exp e +15% di Danno 120giorni [53018] = {34020, gameforge.pet_system.petname_34020, 0}, -- +1500 HP e +15% di danno 30giorni [53019] = {34019, gameforge.pet_system.petname_34019, 0}, -- +1500 HP e +15% di danno 30giorni [53020] = {34017, gameforge.pet_system.petname_34017, 0}, -- +1500 HP e +15% di danno 30giorni [53021] = {34018, gameforge.pet_system.petname_34018, 0}, -- +1500 HP, +15% Forte contro Mostri 30giorni [53022] = {34021, gameforge.pet_system.petname_34021, 0}, -- +1500 HP e +15% di danno 30giorni [53023] = {34022, gameforge.pet_system.petname_34022, 0}, -- +1500 HP e +15% di danno 30giorni [53024] = {34023, gameforge.pet_system.petname_34023, 0}, -- +1500 HP, +5% Trafiggente, +5% Resistenza Abilità 7giorni [53025] = {34024, gameforge.pet_system.petname_34024, 0}, -- +1500 HP e +5% Critico, +10% Resistenza ai Danni Medi 7giorni -- [53026] = { ???, "Pepsi", 0}, -- ??? [53218] = {34023, gameforge.pet_system.petname_34023, 0}, -- +1500 HP, +5% Trafiggente, +5% Resistenza Abilità 30giorni [53219] = {34023, gameforge.pet_system.petname_34023, 0}, -- +1500 HP, +5% Trafiggente, +5% Resistenza Abilità 120giorni [53220] = {34024, gameforge.pet_system.petname_34024, 0}, -- +1500 HP e +5% Critico, +10% Resistenza ai Danni Medi 30giorni [53221] = {34024, gameforge.pet_system.petname_34024, 0}, -- +1500 HP e +5% Critico, +10% Resistenza ai Danni Medi 120giorni [53222] = {34026, gameforge.pet_system.petname_34026, 0}, -- 1500 HP, +15% danno 30giorni [53223] = {34027, gameforge.pet_system.petname_34027, 0}, -- +1500 HP, +15% danno 30giorni [53224] = {34028, gameforge.pet_system.petname_34028, 0}, -- +1500 HP, +15% danno 30giorni [53225] = {34029, gameforge.pet_system.petname_34029, 0}, -- +15% danno, +5% danno critico, +15% danno magico 30giorni [53226] = {34030, gameforge.pet_system.petname_34030, 0}, -- +1500 HP +5% Trafiggenti 120giorni [53227] = {34031, gameforge.pet_system.petname_34031, 0}, -- +1500 HP +5% Critico 120giorni [53228] = {34033, gameforge.pet_system.petname_34033, 0}, -- +1500 HP, +15% danno fisico e danno magico 30giorni [53229] = {34032, gameforge.pet_system.petname_34032, 0}, -- +5% colpi critici, +15% danno fisico e danno magico 30giorni [53230] = {34034, gameforge.pet_system.petname_34034, 0}, -- +5% colpi trafiggenti e +1500 HP 30giorni [53231] = {34035, gameforge.pet_system.petname_34035, 0}, -- +5% colpi critici e +1500 HP 30giorni [53232] = {34039, gameforge.pet_system.petname_34039, 0}, -- +1500 HP e +5% Trafiggenti 30giorni [53233] = {34055, gameforge.pet_system.petname_34055, 0}, -- +5% colpi critici e +1500 HP 30giorni Il pet raccoglierà automaticamente tutti gli oggetti a terra nelle sue vicinanze. [53234] = {34056, gameforge.pet_system.petname_34056, 0}, -- +5% colpi trafiggenti e +1500 HP 30giorni Il pet raccoglierà automaticamente tutti gli oggetti a terra nelle sue vicinanze. [53235] = {34057, gameforge.pet_system.petname_34057, 0}, -- +5% colpi critici e +1500 HP 1giorno Il pet raccoglierà automaticamente tutti gli oggetti a terra nelle sue vicinanze. [53236] = {34060, gameforge.pet_system.petname_34060, 0}, -- +15% Forte contro Mostri e +1500 HP 30giorni Se insieme al Pet evocato si sta utilizzando un Icona Amuleto del Cioccolato.pngAmuleto del Cioccolato, si otterrà 50% Exp Bonus. [53237] = {34061, gameforge.pet_system.petname_34061, 0}, -- +5% colpi critici e +1500 HP 30giorni Se insieme al Pet evocato si sta utilizzando un Icona Amuleto del Cioccolato.pngAmuleto del Cioccolato, si otterrà 50% Exp Bonus. [53238] = {34058, gameforge.pet_system.petname_34058, 0}, -- no bonus 1giorno Se insieme al Pet evocato si sta utilizzando un Icona Amuleto del Cioccolato.pngAmuleto del Cioccolato, si otterrà 20% Exp Bonus. [53239] = {34059, gameforge.pet_system.petname_34059, 0}, -- no bonus 1giorno Se insieme al Pet evocato si sta utilizzando un Icona Amuleto del Cioccolato.pngAmuleto del Cioccolato, si otterrà 20% Exp Bonus. [53240] = {34063, gameforge.pet_system.petname_34063, 0}, -- +5% colpi critici e +1500 HP 30giorni [53241] = {34062, gameforge.pet_system.petname_34062, 0}, -- +1500 HP, +15% Forte contro Mostri 30giorni [53256] = {34066, gameforge.pet_system.petname_34066, 0}, -- no bonus 3600giorni [53242] = {34066, gameforge.pet_system.petname_34066p, 0}, -- +5% colpi critici e +1500 HP 30giorni Il pet raccoglierà automaticamente tutti gli oggetti a terra nelle sue vicinanze. [53243] = {34066, gameforge.pet_system.petname_34066pp, 0}, -- 20% exp 30giorni [53244] = {8592, gameforge.pet_system.petname_8592, 0}, -- mafia +5% colpi critici e +15% di danno 30giorni Equipaggiandolo con un'armatura Vampiro+ , un elmo Vampiro+ e il Leccalecca garantisce un bonus di +20% Exp e + 5% Danni Medi e Abilità [53245] = {8594, gameforge.pet_system.petname_8594, 0}, -- boo +5% colpi trafiggenti e +15% di danno 30giorni Equipaggiandolo con un'armatura Vampiro+ , un elmo Vampiro+ e il Leccalecca garantisce un bonus di +20% Exp e + 5% Danni Medi e Abilità [53246] = {8595, gameforge.pet_system.petname_8595, 0}, -- maister no bonus 1giorno Equipaggiandolo con un'armatura ed elmo Vampiro garantisce un bonus di +20% Exp [53247] = {8597, gameforge.pet_system.petname_8597, 0}, -- tygrys +5% colpi critici e +5% Possibilità di Svenimento 30giorni Equipaggiandolo con il Vestito da festa+, il Copricapo+ o il Basco+ si riceveranno, in aggiunta, due bonus del set. Aggiungendo un Anello della Felicità, si riceverà un altro bonus del set. [53248] = {34049, gameforge.pet_system.petname_34049, 0}, -- razador +5% colpi trafiggenti e +5% Possibilità di Svenimento 1giorno Equipaggiandolo con il Vestito da festa+, il Copricapo+ o il Basco+ si riceveranno, in aggiunta, due bonus del set. Aggiungendo un Anello della Felicità, si riceverà un altro bonus del set. [53249] = {34053, gameforge.pet_system.petname_34053, 0}, -- nemere 30giorni Equipaggiandolo con il vestito da festa, il copricapo o il basco si riceveranno, in aggiunta, un bonus del set. Aggiungendo un Anello della Felicità, si riceverà un altro bonus del set. [53250] = {8590, gameforge.pet_system.petname_8590, 0}, -- bunny ??? [53251] = {8591, gameforge.pet_system.petname_8591, 0}, -- girl ??? -- GF specials [38200] = {34006, gameforge.pet_system.petname_34006, 0}, -- Sigillo Rufus ??? [38201] = {34006, gameforge.pet_system.petname_34006, 0}, -- Sigillo Rufus ??? } end return pet_system.pet_info_map[itemVnum] end function get_spawn_effect_file(idx) if pet_system.effect_table==nil then pet_system.effect_table = { [0] = nil, [1] = "d:\\\\ymir work\\\\effect\\\\etc\\\\appear_die\\\\npc2_appear.mse", } end return pet_system.effect_table[idx] end when -- 38200~38201 38200.use or 38201.use or -- 53001~53026 (no 53003, 53026) 53001.use or 53002.use or 53003.use or 53005.use or 53006.use or 53007.use or 53008.use or 53009.use or 53010.use or 53011.use or 53012.use or 53013.use or 53014.use or 53015.use or 53016.use or 53017.use or 53018.use or 53019.use or 53020.use or 53021.use or 53022.use or 53023.use or 53024.use or 53025.use or -- 53004.use or 53026.use or -- 53218~53251 53218.use or 53219.use or 53220.use or 53221.use or 53222.use or 53223.use or 53224.use or 53225.use or 53226.use or 53227.use or 53228.use or 53229.use or 53230.use or 53231.use or 53232.use or 53233.use or 53234.use or 53235.use or 53236.use or 53237.use or 53238.use or 53239.use or 53240.use or 53241.use or 53242.use or 53243.use or 53244.use or 53245.use or 53246.use or 53247.use or 53248.use or 53249.use or 53250.use or 53251.use or -- 53256 53256.use begin local pet_info = pet_system.get_pet_info(item.vnum) if null ~= pet_info then local mobVnum = pet_info[1] local petName = pet_info[2] local spawn_effect_file_name = pet_system.get_spawn_effect_file(pet_info[3]) if true == pet.is_summon(mobVnum) then if spawn_effect_file_name ~= nil then pet.spawn_effect(mobVnum, spawn_effect_file_name) end pet.unsummon(mobVnum) else if pet.count_summoned() < 1 then pet.summon(mobVnum, petName, false) else syschat(gameforge.pet_system._030_chat) end if spawn_effect_file_name ~= nil then pet.spawn_effect(mobVnum, spawn_effect_file_name) end end -- if pet.is_summon end -- if null ~= pet_info end -- when end -- state end -- quest Link to comment Share on other sites More sharing options...
Yazoo 1 Posted June 20 Share Posted June 20 PetSystem.cpp dans vos source server dans bool CPetActor::Update(DWORD deltaTime) Vous avez quelque chose qui ressemble a ceci ajouter juste ce que vous souhaitez ou enlever la Link to comment Share on other sites More sharing options...
dexoluss 0 Posted June 21 Author Share Posted June 21 Hey thanks. here is my petsystem.cpp Spoiler #include "stdafx.h" #include "config.h" #include "utils.h" #include "vector.h" #include "char.h" #include "sectree_manager.h" #include "char_manager.h" #include "mob_manager.h" #include "PetSystem.h" #include "../../common/VnumHelper.h" #include "packet.h" #include "item_manager.h" #include "item.h" EVENTINFO(petsystem_event_info) { CPetSystem* pPetSystem; }; // PetSystemŔ» update ÇŘÁÖ´Â event. // PetSystemŔş CHRACTER_MANAGERżˇĽ ±âÁ¸ FSMŔ¸·Î update ÇŘÁÖ´Â ±âÁ¸ chractersżÍ ´Ţ¸®, // OwnerŔÇ STATE¸¦ update ÇŇ ¶§ _UpdateFollowAI ÇÔĽö·Î update ÇŘÁŘ´Ů. // ±×·±µĄ ownerŔÇ state¸¦ update¸¦ CHRACTER_MANAGERżˇĽ ÇŘÁֱ⠶§ą®żˇ, // petsystemŔ» updateÇĎ´Ů°ˇ petŔ» unsummonÇĎ´Â şÎşĐżˇĽ ą®Á¦°ˇ »ý°ĺ´Ů. // (CHRACTER_MANAGERżˇĽ update Çϸé chracter destroy°ˇ pendingµÇľî, CPetSystemżˇĽ´Â dangling Ć÷ŔÎĹ͸¦ °ˇÁö°í ŔÖ°Ô µČ´Ů.) // µű¶óĽ PetSystem¸¸ ľ÷µĄŔĚĆ® ÇŘÁÖ´Â event¸¦ ąß»ý˝ĂĹ´. EVENTFUNC(petsystem_update_event) { petsystem_event_info* info = dynamic_cast<petsystem_event_info*>( event->info ); if ( info == NULL ) { sys_err( "check_speedhack_event> <Factor> Null pointer" ); return 0; } CPetSystem* pPetSystem = info->pPetSystem; if (NULL == pPetSystem) return 0; pPetSystem->Update(0); // 0.25Ăʸ¶´Ů °»˝Ĺ. return PASSES_PER_SEC(1) / 4; } /// NOTE: 1Äł¸ŻĹÍ°ˇ ¸î°łŔÇ ĆęŔ» °ˇÁú Ľö ŔÖ´ÂÁö Á¦ÇŃ... Äł¸ŻĹ͸¶´Ů °łĽö¸¦ ´Ů¸Ł°Ô ÇҰŶó¸é şŻĽö·Î łÖµî°ˇ... Ŕ˝.. /// °ˇÁú Ľö ŔÖ´Â °łĽöżÍ µż˝Ăżˇ ĽŇČŻÇŇ Ľö ŔÖ´Â °łĽö°ˇ Ʋ¸± Ľö ŔִµĄ ŔĚ·±°Ç ±âČą ľřŔ¸´Ď ŔĎ´Ü ą«˝Ă const float PET_COUNT_LIMIT = 3; /////////////////////////////////////////////////////////////////////////////////////// // CPetActor /////////////////////////////////////////////////////////////////////////////////////// CPetActor::CPetActor(LPCHARACTER owner, DWORD vnum, DWORD options) { m_dwVnum = vnum; m_dwVID = 0; m_dwOptions = options; m_dwLastActionTime = 0; m_pkChar = 0; m_pkOwner = owner; m_originalMoveSpeed = 0; m_dwSummonItemVID = 0; m_dwSummonItemVnum = 0; } CPetActor::~CPetActor() { this->Unsummon(); m_pkOwner = 0; } void CPetActor::SetName(const char* name) { std::string petName = m_pkOwner->GetName(); if (0 != m_pkOwner && 0 == name && 0 != m_pkOwner->GetName()) { petName += "'s Pet"; } else petName += name; if (true == IsSummoned()) m_pkChar->SetName(petName); m_name = petName; } bool CPetActor::Mount() { if (0 == m_pkOwner) return false; if (true == HasOption(EPetOption_Mountable)) m_pkOwner->MountVnum(m_dwVnum); return m_pkOwner->GetMountVnum() == m_dwVnum;; } void CPetActor::Unmount() { if (0 == m_pkOwner) return; if (m_pkOwner->IsHorseRiding()) m_pkOwner->StopRiding(); } void CPetActor::Unsummon() { if (true == this->IsSummoned()) { // ąöÇÁ »čÁ¦ this->ClearBuff(); this->SetSummonItem(NULL); if (NULL != m_pkOwner) m_pkOwner->ComputePoints(); if (NULL != m_pkChar) M2_DESTROY_CHARACTER(m_pkChar); m_pkChar = 0; m_dwVID = 0; } } DWORD CPetActor::Summon(const char* petName, LPITEM pSummonItem, bool bSpawnFar) { long x = m_pkOwner->GetX(); long y = m_pkOwner->GetY(); long z = m_pkOwner->GetZ(); if (true == bSpawnFar) { x += (number(0, 1) * 2 - 1) * number(2000, 2500); y += (number(0, 1) * 2 - 1) * number(2000, 2500); } else { x += number(-100, 100); y += number(-100, 100); } if (0 != m_pkChar) { m_pkChar->Show (m_pkOwner->GetMapIndex(), x, y); m_dwVID = m_pkChar->GetVID(); return m_dwVID; } m_pkChar = CHARACTER_MANAGER::instance().SpawnMob( m_dwVnum, m_pkOwner->GetMapIndex(), x, y, z, false, (int)(m_pkOwner->GetRotation()+180), false); if (0 == m_pkChar) { sys_err("[CPetSystem::Summon] Failed to summon the pet. (vnum: %d)", m_dwVnum); return 0; } m_pkChar->SetPet(); // m_pkOwner->DetailLog(); // m_pkChar->DetailLog(); //ĆęŔÇ ±ą°ˇ¸¦ ÁÖŔÎŔÇ ±ą°ˇ·Î ĽłÁ¤ÇÔ. m_pkChar->SetEmpire(m_pkOwner->GetEmpire()); m_dwVID = m_pkChar->GetVID(); this->SetName(petName); // SetSummonItem(pSummonItem)¸¦ şÎ¸Ą ČÄżˇ ComputePoints¸¦ şÎ¸Ł¸é ąöÇÁ ŔűżëµĘ. this->SetSummonItem(pSummonItem); m_pkOwner->ComputePoints(); m_pkChar->Show(m_pkOwner->GetMapIndex(), x, y, z); return m_dwVID; } bool CPetActor::_UpdatAloneActionAI(float fMinDist, float fMaxDist) { float fDist = number(fMinDist, fMaxDist); float r = (float)number (0, 359); float dest_x = GetOwner()->GetX() + fDist * cos(r); float dest_y = GetOwner()->GetY() + fDist * sin(r); //m_pkChar->SetRotation(number(0, 359)); // ąćÇâŔş ·Ł´ýŔ¸·Î ĽłÁ¤ //GetDeltaByDegree(m_pkChar->GetRotation(), fDist, &fx, &fy); // ´Ŕ˝ĽÇŃ ¸ř°¨ ĽÓĽş ĂĽĹ©; ĂÖÁľ Ŕ§ÄˇżÍ Áß°Ł Ŕ§Äˇ°ˇ °ĄĽöľř´Ů¸é °ˇÁö ľĘ´Â´Ů. //if (!(SECTREE_MANAGER::instance().IsMovablePosition(m_pkChar->GetMapIndex(), m_pkChar->GetX() + (int) fx, m_pkChar->GetY() + (int) fy) // && SECTREE_MANAGER::instance().IsMovablePosition(m_pkChar->GetMapIndex(), m_pkChar->GetX() + (int) fx/2, m_pkChar->GetY() + (int) fy/2))) // return true; m_pkChar->SetNowWalking(true); //if (m_pkChar->Goto(m_pkChar->GetX() + (int) fx, m_pkChar->GetY() + (int) fy)) // m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0); if (!m_pkChar->IsStateMove() && m_pkChar->Goto(dest_x, dest_y)) m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0); m_dwLastActionTime = get_dword_time(); return true; } // char_state.cpp StateHorseÇÔĽö ±×łÉ C&P -_-; bool CPetActor::_UpdateFollowAI() { if (0 == m_pkChar->m_pkMobData) { //sys_err("[CPetActor::_UpdateFollowAI] m_pkChar->m_pkMobData is NULL"); return false; } // NOTE: Äł¸ŻĹÍ(Ćę)ŔÇ żř·ˇ Ŕ̵ż ĽÓµµ¸¦ ľËľĆľß ÇϴµĄ, ÇŘ´ç °Ş(m_pkChar->m_pkMobData->m_table.sMovingSpeed)Ŕ» Á÷Á˘ŔűŔ¸·Î Á˘±ŮÇŘĽ ľËľĆłľ Ľöµµ ŔÖÁö¸¸ // m_pkChar->m_pkMobData °ŞŔĚ invalidÇŃ °ćżě°ˇ ŔÚÁÖ ąß»ýÇÔ. ÇöŔç ˝Ă°Ł°ü°č»ó żřŔÎŔş ´ŮŔ˝żˇ ĆÄľÇÇĎ°í ŔĎ´ÜŔş m_pkChar->m_pkMobData °ŞŔ» ľĆżą »çżëÇĎÁö ľĘµµ·Ď ÇÔ. // ż©±âĽ ¸Ĺąř °Ë»çÇĎ´Â ŔĚŔŻ´Â ĂÖĂĘ ĂʱâČ ÇŇ ¶§ Á¤»ó °ŞŔ» Á¦´ë·Î ¸řľňľîżŔ´Â °ćżěµµ ŔÖŔ˝.. -_-;; ¤Đ¤Đ¤Đ¤Đ¤Đ¤Đ¤Đ¤Đ¤Đ if (0 == m_originalMoveSpeed) { const CMob* mobData = CMobManager::Instance().Get(m_dwVnum); if (0 != mobData) m_originalMoveSpeed = mobData->m_table.sMovingSpeed; } float START_FOLLOW_DISTANCE = 300.0f; // ŔĚ °Ĺ¸® ŔĚ»ó ¶łľîÁö¸é ÂѾưˇ±â ˝ĂŔŰÇÔ float START_RUN_DISTANCE = 900.0f; // ŔĚ °Ĺ¸® ŔĚ»ó ¶łľîÁö¸é ¶ŮľîĽ ÂѾư¨. float RESPAWN_DISTANCE = 4500.f; // ŔĚ °Ĺ¸® ŔĚ»ó ¸ÖľîÁö¸é ÁÖŔÎ ż·Ŕ¸·Î ĽŇČŻÇÔ. int APPROACH = 200; // Á˘±Ů °Ĺ¸® //bool bDoMoveAlone = true; // Äł¸ŻĹÍżÍ °ˇ±îŔĚ ŔÖŔ» ¶§ ČĄŔÚ ż©±âŔú±â żňÁ÷ŔĎ°ÇÁö ż©şÎ -_-; bool bRun = false; // ¶Ůľîľß ÇĎłŞ? DWORD currentTime = get_dword_time(); long ownerX = m_pkOwner->GetX(); long ownerY = m_pkOwner->GetY(); long charX = m_pkChar->GetX(); long charY = m_pkChar->GetY(); float fDist = DISTANCE_APPROX(charX - ownerX, charY - ownerY); if (fDist >= RESPAWN_DISTANCE) { float fOwnerRot = m_pkOwner->GetRotation() * 3.141592f / 180.f; float fx = -APPROACH * cos(fOwnerRot); float fy = -APPROACH * sin(fOwnerRot); if (m_pkChar->Show(m_pkOwner->GetMapIndex(), ownerX + fx, ownerY + fy)) { return true; } } if (fDist >= START_FOLLOW_DISTANCE) { if( fDist >= START_RUN_DISTANCE) { bRun = true; } m_pkChar->SetNowWalking(!bRun); // NOTE: ÇÔĽö Ŕ̸§ş¸°í ¸ŘĂߴ°ÇÁŮ ľËľŇ´ÂµĄ SetNowWalking(false) ÇĎ¸é ¶Ů´Â°ĹŔÓ.. -_-; Follow(APPROACH); m_pkChar->SetLastAttacked(currentTime); m_dwLastActionTime = currentTime; } //else //{ // if (fabs(m_pkChar->GetRotation() - GetDegreeFromPositionXY(charX, charY, ownerX, ownerX)) > 10.f || fabs(m_pkChar->GetRotation() - GetDegreeFromPositionXY(charX, charY, ownerX, ownerX)) < 350.f) // { // m_pkChar->Follow(m_pkOwner, APPROACH); // m_pkChar->SetLastAttacked(currentTime); // m_dwLastActionTime = currentTime; // } //} // Follow ÁßŔĚÁö¸¸ ÁÖŔΰú ŔĎÁ¤ °Ĺ¸® ŔĚł»·Î °ˇ±îżöÁł´Ů¸é ¸ŘĂă else m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0); //else if (currentTime - m_dwLastActionTime > number(5000, 12000)) //{ // this->_UpdatAloneActionAI(START_FOLLOW_DISTANCE / 2, START_FOLLOW_DISTANCE); //} return true; } bool CPetActor::Update(DWORD deltaTime) { bool bResult = true; // Ćę ÁÖŔÎŔĚ Á׾ú°ĹłŞ, ĽŇČŻµČ ĆęŔÇ »óĹ°ˇ ŔĚ»óÇϴٸé ĆęŔ» ľřľÚ. (NOTE: °ˇ˛ű°ˇ´Ů ŔĚ·± Ŕú·± ŔĚŔŻ·Î ĽŇČŻµČ ĆęŔĚ DEAD »óĹÂżˇ şüÁö´Â °ćżě°ˇ ŔÖŔ˝-_-;) // ĆęŔ» ĽŇČŻÇŃ ľĆŔĚĹŰŔĚ ľř°ĹłŞ, ł»°ˇ °ˇÁř »óĹ°ˇ ľĆ´Ď¶ó¸é ĆęŔ» ľřľÚ. if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID()) || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner() ) { this->Unsummon(); return true; } if (this->IsSummoned() && HasOption(EPetOption_Followable)) bResult = bResult && this->_UpdateFollowAI(); return bResult; } //NOTE : ÁÖŔÇ!!! MinDistance¸¦ Ĺ©°Ô ŔâŔ¸¸é ±× şŻŔ§¸¸ĹŔÇ şŻČµżľČŔş followÇĎÁö ľĘ´Â´Ů, bool CPetActor::Follow(float fMinDistance) { // °ˇ·Á´Â Ŕ§Äˇ¸¦ ąŮ¶óşÁľß ÇŃ´Ů. if( !m_pkOwner || !m_pkChar) return false; float fOwnerX = m_pkOwner->GetX(); float fOwnerY = m_pkOwner->GetY(); float fPetX = m_pkChar->GetX(); float fPetY = m_pkChar->GetY(); float fDist = DISTANCE_SQRT(fOwnerX - fPetX, fOwnerY - fPetY); if (fDist <= fMinDistance) return false; m_pkChar->SetRotationToXY(fOwnerX, fOwnerY); float fx, fy; float fDistToGo = fDist - fMinDistance; GetDeltaByDegree(m_pkChar->GetRotation(), fDistToGo, &fx, &fy); if (!m_pkChar->Goto((int)(fPetX+fx+0.5f), (int)(fPetY+fy+0.5f)) ) return false; m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0, 0); return true; } void CPetActor::SetSummonItem (LPITEM pItem) { if (NULL == pItem) { m_dwSummonItemVID = 0; m_dwSummonItemVnum = 0; return; } m_dwSummonItemVID = pItem->GetVID(); m_dwSummonItemVnum = pItem->GetVnum(); } bool __PetCheckBuff(const CPetActor* pPetActor) { bool bMustHaveBuff = true; switch (pPetActor->GetVnum()) { case 34004: case 34009: if (NULL == pPetActor->GetOwner()->GetDungeon()) bMustHaveBuff = false; default: break; } return bMustHaveBuff; } void CPetActor::GiveBuff() { // ĆÄȲ Ćę ąöÇÁ´Â ´řŔüżˇĽ¸¸ ąß»ýÇÔ. if (!__PetCheckBuff(this)) return; LPITEM item = ITEM_MANAGER::instance().FindByVID(m_dwSummonItemVID); if (NULL != item) item->ModifyPoints(true); return ; } void CPetActor::ClearBuff() { if (NULL == m_pkOwner) return ; TItemTable* item_proto = ITEM_MANAGER::instance().GetTable(m_dwSummonItemVnum); if (NULL == item_proto) return; if (!__PetCheckBuff(this)) // @fixme129 return; for (int i = 0; i < ITEM_APPLY_MAX_NUM; i++) { if (item_proto->aApplies[i].bType == APPLY_NONE) continue; m_pkOwner->ApplyPoint(item_proto->aApplies[i].bType, -item_proto->aApplies[i].lValue); } return ; } /////////////////////////////////////////////////////////////////////////////////////// // CPetSystem /////////////////////////////////////////////////////////////////////////////////////// CPetSystem::CPetSystem(LPCHARACTER owner) { // assert(0 != owner && "[CPetSystem::CPetSystem] Invalid owner"); m_pkOwner = owner; m_dwUpdatePeriod = 400; m_dwLastUpdateTime = 0; } CPetSystem::~CPetSystem() { Destroy(); } void CPetSystem::Destroy() { for (TPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter) { CPetActor* petActor = iter->second; if (0 != petActor) { delete petActor; } } event_cancel(&m_pkPetSystemUpdateEvent); m_petActorMap.clear(); } /// Ćę ˝Ă˝şĹŰ ľ÷µĄŔĚĆ®. µî·ĎµČ ĆęµéŔÇ AI Ăł¸® µîŔ» ÇÔ. bool CPetSystem::Update(DWORD deltaTime) { bool bResult = true; DWORD currentTime = get_dword_time(); // CHARACTER_MANAGERżˇĽ Äł¸ŻĹÍ·ů UpdateÇŇ ¶§ ¸Ĺ°łşŻĽö·Î ÁÖ´Â (Pulse¶ó°í µÇľîŔÖ´Â)°ŞŔĚ ŔĚŔü ÇÁ·ąŔÓ°úŔÇ ˝Ă°ŁÂ÷ŔĚŔÎÁŮ ľËľŇ´ÂµĄ // ŔüÇô ´Ů¸Ą °ŞŔ̶óĽ-_-; ż©±âżˇ ŔÔ·ÂŔ¸·Î µéľîżŔ´Â deltaTimeŔş Ŕǹ̰ˇ ľřŔ˝¤Đ¤Đ if (m_dwUpdatePeriod > currentTime - m_dwLastUpdateTime) return true; std::vector <CPetActor*> v_garbageActor; for (TPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter) { CPetActor* petActor = iter->second; if (0 != petActor && petActor->IsSummoned()) { LPCHARACTER pPet = petActor->GetCharacter(); if (NULL == CHARACTER_MANAGER::instance().Find(pPet->GetVID())) { v_garbageActor.push_back(petActor); } else { bResult = bResult && petActor->Update(deltaTime); } } } for (std::vector<CPetActor*>::iterator it = v_garbageActor.begin(); it != v_garbageActor.end(); it++) DeletePet(*it); m_dwLastUpdateTime = currentTime; return bResult; } /// °ü¸® ¸ń·ĎżˇĽ ĆęŔ» Áöżň void CPetSystem::DeletePet(DWORD mobVnum) { TPetActorMap::iterator iter = m_petActorMap.find(mobVnum); if (m_petActorMap.end() == iter) { sys_err("[CPetSystem::DeletePet] Can't find pet on my list (VNUM: %d)", mobVnum); return; } CPetActor* petActor = iter->second; if (0 == petActor) sys_err("[CPetSystem::DeletePet] Null Pointer (petActor)"); else delete petActor; m_petActorMap.erase(iter); } /// °ü¸® ¸ń·ĎżˇĽ ĆęŔ» Áöżň void CPetSystem::DeletePet(CPetActor* petActor) { for (TPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter) { if (iter->second == petActor) { delete petActor; m_petActorMap.erase(iter); return; } } sys_err("[CPetSystem::DeletePet] Can't find petActor(0x%x) on my list(size: %d) ", petActor, m_petActorMap.size()); } void CPetSystem::Unsummon(DWORD vnum, bool bDeleteFromList) { CPetActor* actor = this->GetByVnum(vnum); if (0 == actor) { sys_err("[CPetSystem::GetByVnum(%d)] Null Pointer (petActor)", vnum); return; } actor->Unsummon(); if (true == bDeleteFromList) this->DeletePet(actor); bool bActive = false; for (TPetActorMap::iterator it = m_petActorMap.begin(); it != m_petActorMap.end(); it++) { bActive |= it->second->IsSummoned(); } if (false == bActive) { event_cancel(&m_pkPetSystemUpdateEvent); m_pkPetSystemUpdateEvent = NULL; } } CPetActor* CPetSystem::Summon(DWORD mobVnum, LPITEM pSummonItem, const char* petName, bool bSpawnFar, DWORD options) { CPetActor* petActor = this->GetByVnum(mobVnum); // µî·ĎµČ ĆęŔĚ ľĆ´Ď¶ó¸é »ő·Î »ýĽş ČÄ °ü¸® ¸ń·Ďżˇ µî·ĎÇÔ. if (0 == petActor) { petActor = M2_NEW CPetActor(m_pkOwner, mobVnum, options); m_petActorMap.insert(std::make_pair(mobVnum, petActor)); } #ifdef ENABLE_NEWSTUFF DWORD petVID = petActor->Summon(petName, pSummonItem, bSpawnFar); if (!petVID) sys_err("[CPetSystem::Summon(%d)] Null Pointer (petVID)", pSummonItem); #endif if (NULL == m_pkPetSystemUpdateEvent) { petsystem_event_info* info = AllocEventInfo<petsystem_event_info>(); info->pPetSystem = this; m_pkPetSystemUpdateEvent = event_create(petsystem_update_event, info, PASSES_PER_SEC(1) / 4); // 0.25ĂĘ } return petActor; } CPetActor* CPetSystem::GetByVID(DWORD vid) const { CPetActor* petActor = 0; bool bFound = false; for (TPetActorMap::const_iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter) { petActor = iter->second; if (0 == petActor) { sys_err("[CPetSystem::GetByVID(%d)] Null Pointer (petActor)", vid); continue; } bFound = petActor->GetVID() == vid; if (true == bFound) break; } return bFound ? petActor : 0; } /// µî·Ď µČ Ćę ÁßżˇĽ ÁÖľîÁř ¸÷ VNUMŔ» °ˇÁř ľ×Ĺ͸¦ ąÝČŻÇĎ´Â ÇÔĽö. CPetActor* CPetSystem::GetByVnum(DWORD vnum) const { CPetActor* petActor = 0; TPetActorMap::const_iterator iter = m_petActorMap.find(vnum); if (m_petActorMap.end() != iter) petActor = iter->second; return petActor; } size_t CPetSystem::CountSummoned() const { size_t count = 0; for (TPetActorMap::const_iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter) { CPetActor* petActor = iter->second; if (0 != petActor) { if (petActor->IsSummoned()) ++count; } } return count; } void CPetSystem::RefreshBuff() { for (TPetActorMap::const_iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter) { CPetActor* petActor = iter->second; if (0 != petActor) { if (petActor->IsSummoned()) { petActor->GiveBuff(); } } } } I didnt find there what you send.. The only thing that catch my eye is this bool CPetActor::Update(DWORD deltaTime) { bool bResult = true; // Ćę ÁÖŔÎŔĚ Á׾ú°ĹłŞ, ĽŇČŻµČ ĆęŔÇ »óĹ°ˇ ŔĚ»óÇϴٸé ĆęŔ» ľřľÚ. (NOTE: °ˇ˛ű°ˇ´Ů ŔĚ·± Ŕú·± ŔĚŔŻ·Î ĽŇČŻµČ ĆęŔĚ DEAD »óĹÂżˇ şüÁö´Â °ćżě°ˇ ŔÖŔ˝-_-;) // ĆęŔ» ĽŇČŻÇŃ ľĆŔĚĹŰŔĚ ľř°ĹłŞ, ł»°ˇ °ˇÁř »óĹ°ˇ ľĆ´Ď¶ó¸é ĆęŔ» ľřľÚ. if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID()) || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner() ) { this->Unsummon(); return true; } if (this->IsSummoned() && HasOption(EPetOption_Followable)) bResult = bResult && this->_UpdateFollowAI(); return bResult; } If i rewrite this->summon(); return true; Wouldnt it fix the problem of pet missing after death? Thanks Link to comment Share on other sites More sharing options...
dexolus 12 Posted Saturday at 01:03 PM Share Posted Saturday at 01:03 PM Thanks bro, it works pet stays after death but disappear after teleport which i dont mind and i like it thanks for help Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now