Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 01/08/20 in all areas

  1. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Hello, came by to share something simple yet helpful for players, someone requested me this feature that allows you to input money with k format on the pick money dialog window, this will enable you to input “1kk” instead of “1000000” Hope it comes in handy for who is planning to use it.
    4 points
  2. Hello, Corrections of some syntax error made by Ymir; cmd_general.cpp Find: ACMD(do_shutdown) { if (NULL == ch) { sys_err("Accept shutdown command from %s.", ch->GetName()); } TPacketGGShutdown p; p.bHeader = HEADER_GG_SHUTDOWN; P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShutdown)); Shutdown(10); } Replace: ACMD(do_shutdown) { if (!ch) return; sys_err("Accept shutdown command from %s.", ch->GetName()); TPacketGGShutdown p; p.bHeader = HEADER_GG_SHUTDOWN; P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShutdown)); Shutdown(10); } Dungeon.cpp Find: float CDungeon::GetUniqueHpPerc(const std::string& key) { TUniqueMobMap::iterator it = m_map_UniqueMob.find(key); if (it == m_map_UniqueMob.end()) { sys_err("Unknown Key : %s", key.c_str()); return false; } return (100.f*it->second->GetHP())/it->second->GetMaxHP(); } Replace: float CDungeon::GetUniqueHpPerc(const std::string& key) { TUniqueMobMap::iterator it = m_map_UniqueMob.find(key); if (it == m_map_UniqueMob.end()) { sys_err("Unknown Key : %s", key.c_str()); return 0.0f; } return (100.f*it->second->GetHP())/it->second->GetMaxHP(); } ClientManager.cpp Find: if (!dwSkillVnum > 120) Replace: if (dwSkillVnum > 120) Special Thanks @Moț;
    3 points
  3. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Prepared src packages: *Granny 2.11.8 *libjpeg-9a *Python-2.7 *Crypto++ 8.4.0 *DevIL-1.6.5 *lzo-2.10 Archive password: black
    1 point
  4. M2 Download Center Download Here ( Internal ) İ find it another board, maybe it necessary. Download
    1 point
  5. M2 Download Center Download Here ( Internal ) Hair pinned with Japanese pins only for shaman lady. Such a curiosity - Hair pinned with Japanese pins called Kanzashi. In the Japanese culture, the material of which the pins were made was evidence of a person's social status. High ranking aristocrats had the right to wear gold pins, middle ranking aristocrats had the right to wear silver pins, and ordinary people, regardless of their material status, had to settle for brass pins. Download: [Hidden Content]
    1 point
  6. No aggro-pulling when the monster is poisoned and you're dead and want to stand up again. maybe someone need this. in char_battle.cpp void CHARACTER::UpdateAggrPointEx(LPCHARACTER pAttacker, EDamageType type, int dam, CHARACTER::TBattleInfo & info) //this (last line): ChangeVictimByAggro(info.iAggro, pAttacker); //Change with this: if (type != DAMAGE_TYPE_POISON) ChangeVictimByAggro(info.iAggro, pAttacker);
    1 point
  7. I know what they mean.We are talking about wrong codes, not efficient
    1 point
  8. @HITRON After a brief test i noticed that the flag AFF_EUNHYUNG is set after skill computation, so it needs a fix, i will edit the first post as well. Full fix tested and working in char.h add friend struct RemoveInvisibleVictim; then in char_skill.cpp add this struct struct RemoveInvisibleVictim{ RemoveInvisibleVictim(LPCHARACTER pkOldVictim) { m_pkOldVictim = pkOldVictim; } void operator () (LPENTITY ent) { if (ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER pkChr = (LPCHARACTER) ent; if (pkChr && pkChr->IsMonster()) { LPCHARACTER pkVictim = pkChr->GetVictim(); if (pkVictim && pkVictim == m_pkOldVictim) { LPCHARACTER new_victim = pkChr->GetNearestVictim(pkChr); // or optional GetHighestDpsVictim(pkChr) if (new_victim != m_pkOldVictim) //NEED TO ADD CHECK HERE AFF_EUNHYUNG WILL BE SET LATER pkChr->SetVictim(new_victim); else pkChr->SetVictim(NULL); } } } } LPCHARACTER m_pkOldVictim; }; then in function (char_skill.cpp) int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel) add if (dwVnum == SKILL_EUNHYUNG && GetSectree()) { RemoveInvisibleVictim f(this); GetSectree()->ForEachAround(f); } OPTIONAL: GetHighestDpsVictim in char_battle.cpp LPCHARACTER CHARACTER::GetHighestDpsVictim(LPCHARACTER pkChr) { if (NULL == pkChr) pkChr = this; float fMinDist = 99999.0f; float fMaxDamage = 0.0f; LPCHARACTER pkVictim = NULL; TDamageMap::iterator it = m_map_kDamage.begin(); // 일단 주위에 없는 사람을 걸러 낸다. while (it != m_map_kDamage.end()) { const VID & c_VID = it->first; float fDamage = it->second.iTotalDamage; ++it; LPCHARACTER pAttacker = CHARACTER_MANAGER::instance().Find(c_VID); if (!pAttacker) continue; if (pAttacker->IsAffectFlag(AFF_EUNHYUNG) || pAttacker->IsAffectFlag(AFF_INVISIBILITY) || pAttacker->IsAffectFlag(AFF_REVIVE_INVISIBLE)) continue; float fDist = DISTANCE_APPROX(pAttacker->GetX() - pkChr->GetX(), pAttacker->GetY() - pkChr->GetY()); if (fDist < fMinDist && !pAttacker->IsDead() && fDamage > fMaxDamage) { pkVictim = pAttacker; fMaxDamage = fDamage; } } return pkVictim; }
    1 point
  9. The aggro taken is from a damage map iterator hence the only players found by the function are player attacking the monster, moreover you can just create a different method for selecting your next target just the way you select the nearest. The already existing functions checks for invisibility affect when selecting target and they have no knowledge about a potential change of the affect, that's why when you enter invisibility you need to check sectree to tell who and who's not attacking you and inform them about your new state. example code for GetHighestDpsVictim(LPCHARACTER pkChr) { if (NULL == pkChr) pkChr = this; float fMinDist = 99999.0f; float fMaxDamage = 0.0f; LPCHARACTER pkVictim = NULL; TDamageMap::iterator it = m_map_kDamage.begin(); // 일단 주위에 없는 사람을 걸러 낸다. while (it != m_map_kDamage.end()) { const VID & c_VID = it->first; float fDamage = it->second.iTotalDamage; ++it; LPCHARACTER pAttacker = CHARACTER_MANAGER::instance().Find(c_VID); if (!pAttacker) continue; if (pAttacker->IsAffectFlag(AFF_EUNHYUNG) || pAttacker->IsAffectFlag(AFF_INVISIBILITY) || pAttacker->IsAffectFlag(AFF_REVIVE_INVISIBLE)) continue; float fDist = DISTANCE_APPROX(pAttacker->GetX() - pkChr->GetX(), pAttacker->GetY() - pkChr->GetY()); if (fDist < fMinDist && !pAttacker->IsDead() && fDamage > fMaxDamage) { pkVictim = pAttacker; fMaxDamage = fDamage; } } return pkVictim; }
    1 point
  10. shopEx.cpp find: for (itertype(m_vec_shopTabs) it = m_vec_shopTabs.begin(); it != m_vec_shopTabs.end(); it++) replace: for (itertype(m_vec_shopTabs) it = m_vec_shopTabs.begin(); it != m_vec_shopTabs.end(); ++it) also.. [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content]
    1 point
  11. Kimetsu no Yaiba ( Demon Slayer) Trailer: Ever since the death of his father, the burden of supporting the family has fallen upon Tanjirou Kamado's shoulders. Though living impoverished on a remote mountain, the Kamado family are able to enjoy a relatively peaceful and happy life. One day, Tanjirou decides to go down to the local village to make a little money selling charcoal. On his way back, night falls, forcing Tanjirou to take shelter in the house of a strange man, who warns him of the existence of flesh-eating demons that lurk in the woods at night. When he finally arrives back home the next day, he is met with a horrifying sight—his whole family has been slaughtered. Worse still, the sole survivor is his sister Nezuko, who has been turned into a bloodthirsty demon. Consumed by rage and hatred, Tanjirou swears to avenge his family and stay by his only remaining sibling. Alongside the mysterious group calling themselves the Demon Slayer Corps, Tanjirou will do whatever it takes to slay the demons and protect the remnants of his beloved sister's humanity.
    1 point
  12. A possible way to fix this issue is to change the scale of sash when the character is dead, at first I think all characters will be in the same position while laying down so adjusting the z position to -30 should do the trick and would be less weird. @ InstanceBase.cpp /// 1. // Search @ void CInstanceBase::SetAcce m_GraphicThingInstance.SetScalePosition(fPositionX, fPositionY, fPositionZ); // Add above if (IsDead()) fPositionZ -= 30; @ char_battle.cpp /// 1. // Search @ void CHARACTER::Dead GetDesc()->SetPhase(PHASE_DEAD); // Add below LPITEM pkAcce = GetWear(WEAR_COSTUME_ACCE); if (pkAcce && pkAcce->IsEquipped()) this->UpdatePacket();
    1 point
  13. Refine stone GUI. It turned out quite nice, so it's worth showing.
    1 point
  14. Login interface. There is probably everything a player needs in it
    1 point
  15. I would like to correct you. ++it is more efficient because it++ need to return a copy of the object then increment itself.
    0 points
  16. Would be nice if you could also provide informations about the fixes, and why is better like this way. Example the virtual void with void [...] override; is the same virtual void is for overidding, could be also virtual void [...] override; ++i increments the value, then returns it. i++ returns the value, and then increments it. Also when the function is float a simple 0 do the work if the value is zero. return 0.0f; return 0; NULL = 0 (can return integers) nullptr (is keyword that represents a null pointer value, not integers) Thanks.
    0 points
  17. 0 points
  18. Good idea but there's a little mistake; while(dwSkillVnum != 0 || dwSkillVnum < 120); Replace: while(dwSkillVnum > 120); Here 0 control is unnecessary table 0 vnum does not have skill
    0 points
  19. Hello.. How can I communicate with you?! Do you have a website where you can post your paid and free business?
    0 points
  20. I think I did not explained my ideas correctly or clearly, I apologize. This is NOT a struct to check if anybody else is invisible, as you said. This struct checks who's attacking a said target, and you call it when that target enters invisibility. So basically when someone uses stealth skill, the server checks if any monster is attacking him, IF so it tells them to find someone else to attack. The check is on the monster attacking a target who's getting invisible.
    0 points
  21. else if ((dwItemVnum == 50300 || dwItemVnum == 70037) && pItemAward->dwSocket0 == 0) { DWORD dwSkillIdx; DWORD dwSkillVnum; do { dwSkillIdx = number(0, m_vec_skillTable.size()-1); dwSkillVnum = m_vec_skillTable[dwSkillIdx].dwVnum; } while(dwSkillVnum != 0 || dwSkillVnum < 120); pItemAward->dwSocket0 = dwSkillVnum; }
    0 points
×
×
  • 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.