eluna-scripts-ornfelt/lua/WowEmulationScriptPack/C++/Development/Event Rewards.cpp

583 lines
27 KiB
C++
Raw Permalink Normal View History

2023-08-16 00:50:59 +02:00
#include "ScriptPCH.h"
#include "Player.h"
class reward_npc : public CreatureScript
{
public:
reward_npc()
: CreatureScript("reward_npc")
{
}
enum GOSSIPMENU
{
REQ_REBIRTHPOINTS = 1,
EVENT_CATEGORIES = 4,
REQ_NEXT_EVENTS = 2,
EVENT_TELEPORT = 3,
MAIN_MENU = 5
};
enum REWARDTYPES
{
REWARD_TYPE_ITEM = 0,
REWARD_TYPE_HONOR = 1,
REWARD_TYPE_TITLE = 2,
REWARD_TYPE_XP = 3,
REWARD_TYPE_SPELL = 4,
REWARD_TYPE_BUFF = 5,
REWARD_TYPE_ARENA = 6
};
void RewardScript(Player* player, int scriptid)
{
QueryResult result = WorldDatabase.PQuery("SELECT type, param1, param2, param3 FROM rebirth_reward_scripts WHERE id = %d",scriptid);
if (result)
{
Field* field = result->Fetch();
do
{
int type = field[0].GetInt32();
int param1 = field[1].GetInt32();
int param2 = field[2].GetInt32();
int param3 = field[3].GetInt32();
switch (type)
{
case 0:
player->RemoveAura(param1);
break;
case 1:
player->DestroyItemCount(param1, param2, true, false);
break;
case 2:
player->removeSpell(param1,false,false);
break;
}
} while (result->NextRow());
}
}
void SendMessageToPlayer(Player* player, Creature* creature, std::string message)
{
char str_info[200];
sprintf(str_info,"%s",message.c_str());
OnGossipHello(player, creature);
player->MonsterWhisper(str_info,player->GetGUID(),true);
}
bool CheckCondition(int condition, int cParam1, int cParam2, int cParam3, int negation, Player* player)
{
int TEAM = 0;
switch (condition)
{
case 0: //Keine Condition
return true;
break;
case 1: //Spell Condition
if (player->HasSpell(cParam1) && negation == 0) //Wenn er den Spell hat und negation = 0 ist dann True
return true;
else if (!player->HasSpell(cParam1) && negation == 0)
return false;
if (!player->HasSpell(cParam1) && negation == 1) //Wenn er den Spell hat und negation = 1 ist dann False
return true;
else if (player->HasSpell(cParam1) && negation == 1)
return false;
break;
case 2: //Title Condition
if (player->HasTitle(sCharTitlesStore.LookupEntry(cParam1)) && negation == 0)
return true;
else if (!player->HasTitle(sCharTitlesStore.LookupEntry(cParam1)) && negation == 0)
return false;
if (player->HasTitle(sCharTitlesStore.LookupEntry(cParam1)) && negation == 1)
return false;
else if (!player->HasTitle(sCharTitlesStore.LookupEntry(cParam1)) && negation == 1)
return true;
break;
case 3: //Item Condition
if (player->HasItemCount(cParam1,cParam2,true) && negation == 0)
return true;
else if (!player->HasItemCount(cParam1,cParam2,true) && negation == 0)
return false;
if (player->HasItemCount(cParam1,cParam2,true) && negation == 1)
return false;
else if (!player->HasItemCount(cParam1,cParam2,true) && negation == 1)
return true;
break;
case 4: //Level Condition
if (player->getLevel() >= cParam1 && negation == 0)
return true;
else if (player->getLevel() <= cParam1 && negation == 0)
return false;
if (player->getLevel() >= cParam1 && negation == 1)
return false;
else if (player->getLevel() <= cParam1 && negation == 1)
return true;
break;
case 5: //Faction Condition
TEAM = cParam1 == 1 ? ALLIANCE : HORDE;
if (player->GetTeam() == TEAM && negation == 0)
return true;
else if (player->GetTeam() != TEAM && negation == 0)
return false;
if (player->GetTeam() != TEAM && negation == 1)
return true;
else if (player->GetTeam() == TEAM && negation == 1)
return false;
break;
case 6: //Race Condition
if (player->getRace() == cParam1 && negation == 0)
return true;
else if (player->getRace() != cParam1 && negation == 0)
return false;
if (player->getRace() != cParam1 && negation == 1)
return true;
else if (player->getRace() == cParam1 && negation == 1)
return false;
break;
case 7: //Class Condition
if (player->getClass() == cParam1 && negation == 0)
return true;
else if (player->getClass() != cParam1 && negation == 0)
return false;
if (player->getClass() != cParam1 && negation == 1)
return true;
else if (player->getClass() == cParam1 && negation == 1)
return false;
break;
case 8: //Aura Condition
if (player->HasAura(cParam1) && negation == 0)
return true;
else if (!player->HasAura(cParam1) && negation == 0)
return false;
if (!player->HasAura(cParam1) && negation == 1)
return true;
else if (player->HasAura(cParam1) && negation == 1)
return false;
break;
}
return true;
}
void RequestRebirthPoints(Player* player, Creature* creature)
{
QueryResult result = LoginDatabase.PQuery("SELECT rebirth_punkte FROM account WHERE id = %u", player->GetSession()->GetAccountId());
if (result)
{
Field* field = result->Fetch();
uint32 eventPunkte = field[0].GetUInt32();
char str_info[200];
sprintf(str_info,"Du hast %u Rebirth Punkte!", eventPunkte);
player->PlayerTalkClass->ClearMenus();
player->MonsterWhisper(str_info,player->GetGUID(),true);
OnGossipHello(player, creature);
}
else if (!result)
SendMessageToPlayer(player, creature,"Es ist ein Fehler aufgetreten. Bitte wende dich an einen Administrator und melde FehlerID 100!");
}
void RequestNextEvents(Player* player, Creature* creature)
{
QueryResult result = LoginDatabase.PQuery("SELECT FROM_UNIXTIME(date), type, reqLevel FROM rebirth_next_event WHERE date > UNIX_TIMESTAMP()");
if (result)
{
do
{
Field* field = result->Fetch();
std::string eventType = "";
std::string date = field[0].GetCString();
uint32 type = field[1].GetUInt32();
uint32 reqLevel = field[2].GetUInt32();
if (type == 0)
eventType = "PvP";
else if (type == 1)
eventType = "PvE";
else if (type == 2)
eventType = "Fun";
else
eventType = "Sonstiges";
char str_info[200];
sprintf(str_info,"Event Info: Datum: %s || Typ: %s || Empfohlenes Level: %u",date.c_str(),eventType.c_str(),reqLevel);
player->PlayerTalkClass->ClearMenus();
player->MonsterWhisper(str_info,player->GetGUID(),true);
OnGossipHello(player, creature);
} while (result->NextRow());
}
else
SendMessageToPlayer(player, creature,"Es ist zurzeit kein Event in Planung!");
}
void TeleportToEvent(Player* player, Creature* creature)
{
QueryResult result = LoginDatabase.PQuery("SELECT x, y, z, map, reqLevel FROM rebirth_next_event WHERE active = 1");
if (result && isActive())
{
Field* field = result->Fetch();
float x = field[0].GetFloat();
float y = field[1].GetFloat();
float z = field[2].GetFloat();
int map = field[3].GetInt32();
int reqLevel = field[4].GetInt32();
if (player->getLevel() >= reqLevel)
player->TeleportTo(map, x, y, z, 0.0f, 0);
else
SendMessageToPlayer(player, creature,"Deine Stufe ist zu niedrig um an diesem Event teilnehmen zu koennen!");
}
else if (!isActive())
SendMessageToPlayer(player, creature,"Der Event Teleport wurde noch nicht vom Eventleiter aktiviert!");
}
bool isActive()
{
QueryResult result = LoginDatabase.PQuery("SELECT * FROM rebirth_next_event WHERE active = 1");
if (result)
return true;
else
return false;
}
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
{
if (sWorld->getBoolConfig(CONFIG_REBIRTH_EVENTSYSTEM_ENABLED))
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Wieviele Rebirth-Punkte habe ich?", GOSSIP_SENDER_MAIN, 1);
if (sWorld->getBoolConfig(CONFIG_REBIRTH_EVENTSYSTEM_NEXT_EVENT_INFO_ENABLED))
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Wann finden die naechsten Events statt?", GOSSIP_SENDER_MAIN, 2);
if (sWorld->getBoolConfig(CONFIG_REBIRTH_EVENTSYSTEM_TELEPORT_ENABLED))
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleportiere mich zum Event!", GOSSIP_SENDER_MAIN, 3);
if (sWorld->getBoolConfig(CONFIG_REBIRTH_EVENTSYSTEM_REWARDS_ENABLED))
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Ich will Belohnungen kaufen!", GOSSIP_SENDER_MAIN, 4);
pPlayer->PlayerTalkClass->SendGossipMenu(120100, pCreature->GetGUID());
}
return true;
}
bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 , uint32 uiAction)
{
pPlayer->PlayerTalkClass->ClearMenus();
QueryResult resultEvent;
QueryResult resultVote;
switch (uiAction)
{
case REQ_REBIRTHPOINTS:
RequestRebirthPoints(pPlayer, pCreature);
break;
case REQ_NEXT_EVENTS:
RequestNextEvents(pPlayer, pCreature);
break;
case EVENT_TELEPORT:
TeleportToEvent(pPlayer, pCreature);
break;
case MAIN_MENU:
OnGossipHello(pPlayer,pCreature);
break;
case EVENT_CATEGORIES: //EventReward Menu
resultEvent = WorldDatabase.PQuery("SELECT id, name FROM rebirth_reward_categorie");
if (resultEvent)
{
do
{
Field* field = resultEvent->Fetch();
int catId = field[0].GetInt32();
std::string catName = field[1].GetCString();
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, catName.c_str(), GOSSIP_SENDER_MAIN, catId+100);
} while (resultEvent->NextRow());
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, ">> Hauptmenue <<", GOSSIP_SENDER_MAIN, 5);
pPlayer->PlayerTalkClass->SendGossipMenu(907, pCreature->GetGUID());
}
break;
}
/*
Hier wird die Liste der Rewards erstellt
ToDo: Eine sch<EFBFBD>nere Umsetzung finden
*/
if (uiAction >= 100 && uiAction < 1000)
{
QueryResult result = WorldDatabase.PQuery("SELECT id, name, type, param1, param2, param3, cost FROM rebirth_rewards WHERE catid = %u", uiAction-100);
if (result)
{
do
{
Field* field = result->Fetch();
int id = field[0].GetInt32();
std::string name = field[1].GetCString();
int cost = field[6].GetInt32();
char str_info[200];
sprintf(str_info,"%s (%d RP)",name.c_str(), cost);
sLog->outError(str_info);
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, str_info, GOSSIP_SENDER_MAIN, id+1000);
} while (result->NextRow());
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, ">> Kategorien <<", GOSSIP_SENDER_MAIN, 4);
pPlayer->PlayerTalkClass->SendGossipMenu(907, pCreature->GetGUID());
}
}
/*
Ab hier werden die Belohnungen vergeben
ToDo: Eine sch<EFBFBD>nere Umsetzung finden
*/
if (uiAction >= 1000 && uiAction < 10000)
{
QueryResult result = WorldDatabase.PQuery("SELECT type, param1, param2, param3, cost, condition_type, cond_value1, cond_value2, cond_value3, negation, script_id FROM rebirth_rewards WHERE id = %u AND catid != ''", uiAction-1000);
QueryResult resulta = LoginDatabase.PQuery("SELECT rebirth_punkte FROM account WHERE id = %u", pPlayer->GetSession()->GetAccountId());
int pRP = 0;
if (resulta)
{
Field* field = resulta->Fetch();
int pRP = field[0].GetInt32();
if (result)
{
Field* field = result->Fetch();
int type = field[0].GetInt32();
int param1 = field[1].GetInt32();
int param2 = field[2].GetInt32();
int param3 = field[3].GetInt32();
int cost = field[4].GetInt32();
int condition = field[5].GetInt32();
int cond_value1 = field[6].GetInt32();
int cond_value2 = field[7].GetInt32();
int cond_value3 = field[8].GetInt32();
int negation = field[9].GetInt32();
int scriptID = field[10].GetInt32();
switch (type)
{
case REWARD_TYPE_ITEM:
{
if (cost <= pRP)
{
Item* item = pPlayer->GetItemByEntry(param1);
if (pPlayer->HasItemCount(param1, 1, true))
{
if (item->GetTemplate()->MaxCount <= pPlayer->GetItemCount(param1, true, 0))
{
SendMessageToPlayer(pPlayer, pCreature, "Du hast bereits die maximale Anzahl dieses Gegenstands erreicht. Du kannst keine weiteren aufnehmen!");
pPlayer->PlayerTalkClass->ClearMenus();
OnGossipHello(pPlayer, pCreature);
return true;
}
}
if (CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
{
RewardScript(pPlayer, scriptID);
pPlayer->AddItem(param1, param2);
SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
break;
}
case REWARD_TYPE_HONOR:
{
if (cost <= pRP)
{
if (pPlayer->GetHonorPoints() + param1 <= 75000 && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
{
RewardScript(pPlayer, scriptID);
pPlayer->ModifyHonorPoints(param1);
LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
break;
}
case REWARD_TYPE_TITLE:
{
if (cost <= pRP)
{
CharTitlesEntry const* title;
title = sCharTitlesStore.LookupEntry(param1);
if (!pPlayer->HasTitle(title) && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
{
RewardScript(pPlayer, scriptID);
pPlayer->SetTitle(title);
LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
break;
}
case REWARD_TYPE_XP:
{
if (cost <= pRP)
{
if (pPlayer->getLevel() < 80 && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
{
RewardScript(pPlayer, scriptID);
pPlayer->GiveXP(param1,pPlayer,1.0f);
LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
break;
}
case REWARD_TYPE_SPELL:
{
if (cost <= pRP)
{
if (!pPlayer->HasSpell(param1) && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
{
RewardScript(pPlayer, scriptID);
pPlayer->learnSpell(param1,false);
LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
break;
}
case REWARD_TYPE_BUFF:
{
if (cost <= pRP)
{
sLog->outError("CheckCondition(%d, cond_value1, cond_value2, cond_value3, negation, pPlayer)",condition);
if (CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
{
sLog->outError("true>>");
RewardScript(pPlayer, scriptID);
pPlayer->AddAura(param1,pPlayer);
LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
break;
}
case REWARD_TYPE_ARENA:
{
if (cost <= pRP)
{
if (pPlayer->GetArenaPoints() + param1 <= 4000 && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
{
RewardScript(pPlayer, scriptID);
pPlayer->ModifyArenaPoints(param1);
LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
}
else
SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
break;
}
}
}
}
}
return true;
}
};
void AddSC_reward_npc()
{
new reward_npc();
}