Jump to content

NoobMaster1337

Inactive Member
  • Posts

    10
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by NoobMaster1337

  1. Not tested: Replace the void CHARACTER::Reward(bool bItemDrop) function. (char_battle.cpp)

    void CHARACTER::Reward(bool bItemDrop)
    {
    	if (GetRaceNum() == 5001)
    	{
    		PIXEL_POSITION pos;
    
    		if (!SECTREE_MANAGER::instance().GetMovablePosition(GetMapIndex(), GetX(), GetY(), pos))
    			return;
    
    		LPITEM item;
    		int iGold = number(GetMobTable().dwGoldMin, GetMobTable().dwGoldMax);
    		iGold = iGold * CHARACTER_MANAGER::instance().GetMobGoldAmountRate(NULL) / 100;
    		iGold *= GetGoldMultipler();
    		int iSplitCount = number(25, 35);
    
    		sys_log(0, "WAEGU Dead gold %d split %d", iGold, iSplitCount);
    
    		for (int i = 1; i <= iSplitCount; ++i)
    		{
    			if ((item = ITEM_MANAGER::instance().CreateItem(1, iGold / iSplitCount)))
    			{
    				if (i != 0)
    				{
    					pos.x = number(-7, 7) * 20;
    					pos.y = number(-7, 7) * 20;
    
    					pos.x += GetX();
    					pos.y += GetY();
    				}
    
    				item->AddToGround(GetMapIndex(), pos);
    				item->StartDestroyEvent();
    			}
    		}
    		return;
    	}
    
       	LPCHARACTER pkAttacker = DistributeExp();
    
    	if (!pkAttacker)
    		return;
    
    	if (pkAttacker->IsPC())
    	{
    		if (GetLevel() - pkAttacker->GetLevel() >= -10)
    			if (pkAttacker->GetRealAlignment() < 0)
    			{
    				if (pkAttacker->IsEquipUniqueItem(UNIQUE_ITEM_FASTER_ALIGNMENT_UP_BY_KILL))
    					pkAttacker->UpdateAlignment(14);
    				else
    					pkAttacker->UpdateAlignment(7);
    			}
    			else
    				pkAttacker->UpdateAlignment(2);
    
    		pkAttacker->SetQuestNPCID(GetVID());
    		quest::CQuestManager::instance().Kill(pkAttacker->GetPlayerID(), GetRaceNum());
    		CHARACTER_MANAGER::instance().KillLog(GetRaceNum());
    
    		if (!number(0, 9))
    		{
    			if (pkAttacker->GetPoint(POINT_KILL_HP_RECOVERY))
    			{
    				int iHP = pkAttacker->GetMaxHP() * pkAttacker->GetPoint(POINT_KILL_HP_RECOVERY) / 100;
    				pkAttacker->PointChange(POINT_HP, iHP);
    				CreateFly(FLY_HP_SMALL, pkAttacker);
    			}
    
    			if (pkAttacker->GetPoint(POINT_KILL_SP_RECOVER))
    			{
    				int iSP = pkAttacker->GetMaxSP() * pkAttacker->GetPoint(POINT_KILL_SP_RECOVER) / 100;
    				pkAttacker->PointChange(POINT_SP, iSP);
    				CreateFly(FLY_SP_SMALL, pkAttacker);
    			}
    		}
    	}
    
    	if (!bItemDrop)
    		return;
    
    	PIXEL_POSITION pos = GetXYZ();
    
    	if (!SECTREE_MANAGER::instance().GetMovablePosition(GetMapIndex(), pos.x, pos.y, pos))
    		return;
    
    	if (test_server)
    		sys_log(0, "Drop money : Attacker %s", pkAttacker->GetName());
    	RewardGold(pkAttacker);
    
    	LPITEM item;
    
    	static std::vector<LPITEM> s_vec_item;
    	s_vec_item.clear();
    
    		if (ITEM_MANAGER::instance().CreateDropItem(this, pkAttacker, s_vec_item))
    		{
    			if (s_vec_item.size() == 0);
    			else if (s_vec_item.size() == 1)
    			{
    				item = s_vec_item[0];
    
    				if (pkAttacker->GetEmptyInventory(item->GetSize()) != -1)
    				{
    					pkAttacker->AutoGiveItem(item->GetVnum(), item->GetCount());
    				}
    			}
    
    			pos.x = number(-7, 7) * 20;
    			pos.y = number(-7, 7) * 20;
    			pos.x += GetX();
    			pos.y += GetY();
    
    			sys_log(0, "DROP_ITEM: %s %d %d from %s", item->GetName(), pos.x, pos.y, GetName());
    		}
    		else
    		{
    			int iItemIdx = s_vec_item.size() - 1;
    
    			std::priority_queue<std::pair<int, LPCHARACTER> > pq;
    
    			int total_dam = 0;
    
    			for (auto it = m_map_kDamage.begin(); it != m_map_kDamage.end(); ++it)
    			{
    				int iDamage = it->second.iTotalDamage;
    				if (iDamage > 0)
    				{
    					LPCHARACTER ch = CHARACTER_MANAGER::instance().Find(it->first);
    
    					if (ch)
    					{
    						pq.push(std::make_pair(iDamage, ch));
    						total_dam += iDamage;
    					}
    				}
    			}
    
    			std::vector<LPCHARACTER> v;
    
    			while (!pq.empty() && pq.top().first * 10 >= total_dam)
    			{
    				v.push_back(pq.top().second);
    				pq.pop();
    			}
    
    			if (v.empty())
    			{
    				while (iItemIdx >= 0)
    				{
    					item = s_vec_item[iItemIdx--];
    
    					if (!item)
    					{
    						sys_err("item null in vector idx %d", iItemIdx + 1);
    						continue;
    					}
    
    					item->AddToGround(GetMapIndex(), pos);
    					item->StartDestroyEvent();
    
    					pos.x = number(-7, 7) * 20;
    					pos.y = number(-7, 7) * 20;
    					pos.x += GetX();
    					pos.y += GetY();
    
    					sys_log(0, "DROP_ITEM: %s %d %d by %s", item->GetName(), pos.x, pos.y, GetName());
    				}
    			}
    			else
    			{
    
    				auto it = v.begin();
    
    				while (iItemIdx >= 0)
    				{
    					item = s_vec_item[iItemIdx--];
    
    					if (!item)
    					{
    						sys_err("item null in vector idx %d", iItemIdx + 1);
    						continue;
    					}
    
    					item->AddToGround(GetMapIndex(), pos);
    
    						LPCHARACTER ch = *it;
    
    						if (ch->GetParty())
    							ch = ch->GetParty()->GetNextOwnership(ch, GetX(), GetY());
    						
    						if (ch->GetEmptyInventory(item->GetSize()) != -1)
    						{
    							ch->AutoGiveItem(item->GetVnum(), item->GetCount());
    						}
    
    				}
    
    						pos.x = number(-7, 7) * 20;
    					pos.y = number(-7, 7) * 20;
    					pos.x += GetX();
    					pos.y += GetY();
    
    					sys_log(0, "DROP_ITEM: %s %d %d by %s", item->GetName(), pos.x, pos.y, GetName());
    				}
    			}
    		}
    	}
    
    	m_map_kDamage.clear();
    }

     

     

    • Love 1
×
×
  • 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.