- Mesaj
- 204
- Çözümler
- 7
- Beğeni
- 49
- Puan
- 479
- Ticaret Puanı
- 0
Mevcut dead fonksiyonum bu şekilde:
Bir boss veya metin kesildi diyelim 1 kere vurmuş hasarı çok az olana bile drop atıyor hatta bazen boss sandığını o kişiye attığı bile oluyor. Bunu nasıl hasara göre yapabilirim? Tüm droplar 1. hasar vurana gitmemeli sadece dengeli olmalı hasar bazında.
Bir boss veya metin kesildi diyelim 1 kere vurmuş hasarı çok az olana bile drop atıyor hatta bazen boss sandığını o kişiye attığı bile oluyor. Bunu nasıl hasara göre yapabilirim? Tüm droplar 1. hasar vurana gitmemeli sadece dengeli olmalı hasar bazında.
char_battle.cpp:
void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead)
{
if (IsDead())
return;
{
if (IsHorseRiding())
{
StopRiding();
}
else if (GetMountVnum())
{
RemoveAffect(AFFECT_MOUNT_BONUS);
m_dwMountVnum = 0;
UnEquipSpecialRideUniqueItem();
UpdatePacket();
}
}
if (!pkKiller && m_dwKillerPID)
pkKiller = CHARACTER_MANAGER::instance().FindByPID(m_dwKillerPID);
m_dwKillerPID = 0;
bool isAgreedPVP = false;
bool isUnderGuildWar = false;
bool isDuel = false;
bool isForked = false;
if (pkKiller && pkKiller->IsPC())
{
if (pkKiller->m_pkChrTarget == this)
pkKiller->SetTarget(NULL);
if (!IsPC() && pkKiller->GetDungeon())
pkKiller->GetDungeon()->IncKillCount(pkKiller, this);
isAgreedPVP = CPVPManager::instance().Dead(this, pkKiller->GetPlayerID());
isDuel = CArenaManager::instance().OnDead(pkKiller, this);
if (IsPC())
{
CGuild * g1 = GetGuild();
CGuild * g2 = pkKiller->GetGuild();
if (g1 && g2)
if (g1->UnderWar(g2->GetID()))
isUnderGuildWar = true;
pkKiller->SetQuestNPCID(GetVID());
quest::CQuestManager::instance().Kill(pkKiller->GetPlayerID(), quest::QUEST_NO_NPC);
CGuildManager::instance().Kill(pkKiller, this);
}
}
#ifdef ENABLE_QUEST_DIE_EVENT
if (IsPC())
{
if (pkKiller)
SetQuestNPCID(pkKiller->GetVID());
// quest::CQuestManager::instance().Die(GetPlayerID(), quest::QUEST_NO_NPC);
quest::CQuestManager::instance().Die(GetPlayerID(), (pkKiller)?pkKiller->GetRaceNum():quest::QUEST_NO_NPC);
}
#endif
//CHECK_FORKEDROAD_WAR
if (IsPC())
{
if (CThreeWayWar::instance().IsThreeWayWarMapIndex(GetMapIndex()))
isForked = true;
}
//END_CHECK_FORKEDROAD_WAR
if (pkKiller &&
!isAgreedPVP &&
!isUnderGuildWar &&
IsPC() &&
!isDuel &&
!isForked)
{
if (GetGMLevel() == GM_PLAYER || test_server)
{
ItemDropPenalty(pkKiller);
}
}
if (true == isForked)
{
CThreeWayWar::instance().onDead( this, pkKiller );
}
SetPosition(POS_DEAD);
if (pkKiller && IsPC() && !pkKiller->IsPC())
{
ClearAffect(true, true);
}
else
{
ClearAffect(true);
}
if (pkKiller && IsPC())
{
if (!pkKiller->IsPC())
{
if (!isForked)
{
sys_log(1, "DEAD: %s %p WITH PENALTY", GetName(), this);
SET_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);
LogManager::instance().CharLog(this, pkKiller->GetRaceNum(), "DEAD_BY_NPC", pkKiller->GetName());
}
}
else
{
sys_log(1, "DEAD_BY_PC: %s %p KILLER %s %p", GetName(), this, pkKiller->GetName(), get_pointer(pkKiller));
REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);
if (GetEmpire() != pkKiller->GetEmpire())
{
int iEP = MIN(GetPoint(POINT_EMPIRE_POINT), pkKiller->GetPoint(POINT_EMPIRE_POINT));
PointChange(POINT_EMPIRE_POINT, -(iEP / 10));
pkKiller->PointChange(POINT_EMPIRE_POINT, iEP / 5);
if (GetPoint(POINT_EMPIRE_POINT) < 10)
{
}
char buf[256];
snprintf(buf, sizeof(buf),
"%d %d %d %s %d %d %d %s",
GetEmpire(), GetAlignment(), GetPKMode(), GetName(),
pkKiller->GetEmpire(), pkKiller->GetAlignment(), pkKiller->GetPKMode(), pkKiller->GetName());
LogManager::instance().CharLog(this, pkKiller->GetPlayerID(), "DEAD_BY_PC", buf);
}
else
{
if (!isAgreedPVP && !isUnderGuildWar && !IsKillerMode() && GetAlignment() >= 0 && !isDuel && !isForked)
{
int iNoPenaltyProb = 0;
if (pkKiller->GetAlignment() >= 0) // 1/3 percent down
iNoPenaltyProb = 33;
else // 4/5 percent down
iNoPenaltyProb = 20;
if (number(1, 100) < iNoPenaltyProb)
pkKiller->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¿ë½ÅÀÇ º¸È£·Î ¾ÆÀÌÅÛÀÌ ¶³¾îÁöÁö ¾Ê¾Ò½À´Ï´Ù."));
else
{
if (pkKiller->GetParty())
{
FPartyAlignmentCompute f(-20000, pkKiller->GetX(), pkKiller->GetY());
pkKiller->GetParty()->ForEachOnlineMember(f);
if (f.m_iCount == 0)
pkKiller->UpdateAlignment(-20000);
else
{
sys_log(0, "ALIGNMENT PARTY count %d amount %d", f.m_iCount, f.m_iAmount);
f.m_iStep = 1;
pkKiller->GetParty()->ForEachOnlineMember(f);
}
}
else
pkKiller->UpdateAlignment(-20000);
}
}
char buf[256];
snprintf(buf, sizeof(buf),
"%d %d %d %s %d %d %d %s",
GetEmpire(), GetAlignment(), GetPKMode(), GetName(),
pkKiller->GetEmpire(), pkKiller->GetAlignment(), pkKiller->GetPKMode(), pkKiller->GetName());
LogManager::instance().CharLog(this, pkKiller->GetPlayerID(), "DEAD_BY_PC", buf);
}
}
}
else
{
sys_log(1, "DEAD: %s %p", GetName(), this);
REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);
}
ClearSync();
//sys_log(1, "stun cancel %s[%d]", GetName(), (DWORD)GetVID());
event_cancel(&m_pkStunEvent);
if (IsPC())
{
m_dwLastDeadTime = get_dword_time();
SetKillerMode(false);
GetDesc()->SetPhase(PHASE_DEAD);
}
else
{
if (!IS_SET(m_pointsInstant.instant_flag, INSTANT_FLAG_NO_REWARD))
{
if (!(pkKiller && pkKiller->IsPC() && pkKiller->GetGuild() && pkKiller->GetGuild()->UnderAnyWar(GUILD_WAR_TYPE_FIELD)))
{
if (GetMobTable().dwResurrectionVnum)
{
// DUNGEON_MONSTER_REBIRTH_BUG_FIX
LPCHARACTER chResurrect = CHARACTER_MANAGER::instance().SpawnMob(GetMobTable().dwResurrectionVnum, GetMapIndex(), GetX(), GetY(), GetZ(), true, (int) GetRotation());
if (GetDungeon() && chResurrect)
{
chResurrect->SetDungeon(GetDungeon());
}
// END_OF_DUNGEON_MONSTER_REBIRTH_BUG_FIX
Reward(false
#ifdef ENABLE_KILL_EVENT_FIX
, pkKiller
#endif
);
}
else if (IsRevive())
{
Reward(false
#ifdef ENABLE_KILL_EVENT_FIX
, pkKiller
#endif
);
}
else
{
Reward(true
#ifdef ENABLE_KILL_EVENT_FIX
, pkKiller
#endif
); // Drops gold, item, etc..
}
}
else
{
if (pkKiller->m_dwUnderGuildWarInfoMessageTime < get_dword_time())
{
pkKiller->m_dwUnderGuildWarInfoMessageTime = get_dword_time() + 60000;
pkKiller->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀüÁß¿¡´Â »ç³É¿¡ µû¸¥ ÀÌÀÍÀÌ ¾ø½À´Ï´Ù."));
}
}
}
}
// BOSS_KILL_LOG
if (GetMobRank() >= MOB_RANK_BOSS && pkKiller && pkKiller->IsPC())
{
char buf[51];
snprintf(buf, sizeof(buf), "%d %ld", g_bChannel, pkKiller->GetMapIndex());
if (IsStone())
LogManager::instance().CharLog(pkKiller, GetRaceNum(), "STONE_KILL", buf);
else
LogManager::instance().CharLog(pkKiller, GetRaceNum(), "BOSS_KILL", buf);
}
// END_OF_BOSS_KILL_LOG
TPacketGCDead pack;
pack.header = HEADER_GC_DEAD;
pack.vid = m_vid;
PacketAround(&pack, sizeof(pack));
REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_STUN);
if (GetDesc() != NULL) {
itertype(m_list_pkAffect) it = m_list_pkAffect.begin();
while (it != m_list_pkAffect.end())
SendAffectAddPacket(GetDesc(), *it++);
}
if (isDuel == false)
{
if (m_pkDeadEvent)
{
sys_log(1, "DEAD_EVENT_CANCEL: %s %p %p", GetName(), this, get_pointer(m_pkDeadEvent));
event_cancel(&m_pkDeadEvent);
}
if (IsStone())
ClearStone();
if (GetDungeon())
{
GetDungeon()->DeadCharacter(this);
}
SCharDeadEventInfo* pEventInfo = AllocEventInfo<SCharDeadEventInfo>();
if (IsPC())
{
pEventInfo->isPC = true;
pEventInfo->dwID = this->GetPlayerID();
m_pkDeadEvent = event_create(dead_event, pEventInfo, PASSES_PER_SEC(180));
}
else
{
pEventInfo->isPC = false;
pEventInfo->dwID = this->GetVID();
if (IsRevive() == false && HasReviverInParty() == true)
{
m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(0));
}
else
{
m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(0));
}
}
sys_log(1, "DEAD_EVENT_CREATE: %s %p %p", GetName(), this, get_pointer(m_pkDeadEvent));
}
if (m_pkExchange)
m_pkExchange->Cancel();
if (IsCubeOpen())
Cube_close(this);
#ifdef ENABLE_ACCE_COSTUME_SYSTEM
if (IsPC())
CloseAcce();
#endif
CShopManager::instance().StopShopping(this);
CloseMyShop();
CloseSafebox();
if (IsMonster() && 2493 == GetMobTable().dwVnum)
{
if (pkKiller && pkKiller->GetGuild())
CDragonLairManager::instance().OnDragonDead(this, pkKiller->GetGuild()->GetID());
else
sys_err("DragonLair: Dragon killed by nobody");
}
}