mirror of
https://github.com/ornfelt/azerothcore_lua_scripts
synced 2026-08-22 06:26:03 -04:00
927 lines
30 KiB
C++
927 lines
30 KiB
C++
|
|
#include "ScriptPCH.h"
|
||
|
|
#include "Chat.h"
|
||
|
|
#include <stdarg.h>
|
||
|
|
#include "GameObject.h"
|
||
|
|
#include "PoolMgr.h"
|
||
|
|
#include "ObjectAccessor.h"
|
||
|
|
#include "Transport.h"
|
||
|
|
using namespace std;
|
||
|
|
|
||
|
|
void CreatePhase(Player * player, bool IsMember, uint32 phase)
|
||
|
|
{
|
||
|
|
ostringstream ss;
|
||
|
|
if(IsMember == false)
|
||
|
|
{
|
||
|
|
ss << "INSERT INTO phase VALUES("
|
||
|
|
<< "'" << player->GetGUID() << "',"
|
||
|
|
<< "'" << player->GetName() << "',"
|
||
|
|
<< "'" << phase << "',"
|
||
|
|
<< "'" << phase << "',"
|
||
|
|
<< "'" << phase << "',"
|
||
|
|
<< "'" << "0" << "');";
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
ss << "INSERT INTO phase_members VALUES("
|
||
|
|
<< "'" << player->GetGUID() << "',"
|
||
|
|
<< "'" << player->GetName() << "',"
|
||
|
|
<< "'" << phase << "',"
|
||
|
|
<< "'" << phase << "');";
|
||
|
|
}
|
||
|
|
|
||
|
|
SQLTransaction transat = CharacterDatabase.BeginTransaction();
|
||
|
|
transat->Append(ss.str().c_str());
|
||
|
|
CharacterDatabase.CommitTransaction(transat);
|
||
|
|
}
|
||
|
|
|
||
|
|
class phasing_system : public CommandScript
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
phasing_system() : CommandScript("phasing_system") { }
|
||
|
|
|
||
|
|
ChatCommand * GetCommands() const
|
||
|
|
{
|
||
|
|
static ChatCommand phaseCmdTable[] =
|
||
|
|
{
|
||
|
|
{ "create", SEC_PLAYER, false, &HandlePhaseCreateCommand, "", NULL },
|
||
|
|
{ "join", SEC_PLAYER, false, &HandlePhaseJoinCommand, "", NULL },
|
||
|
|
{ "go", SEC_PLAYER, false, &HandlePhaseGoCommand, "", NULL },
|
||
|
|
{ "gotarget", SEC_PLAYER, false, &HandlePhaseGoTargetCommand, "", NULL },
|
||
|
|
{ "godelete", SEC_PLAYER, false, &HandlePhaseGoDeleteCommand, "", NULL },
|
||
|
|
{ "help", SEC_PLAYER, false, &HandlePhaseHelpCommand, "", NULL },
|
||
|
|
{ "delete", SEC_PLAYER, false, &HandlePhaseDeleteCommand, "", NULL },
|
||
|
|
{ "kick", SEC_PLAYER, false, &HandlePhaseKickCommand, "", NULL },
|
||
|
|
{ "get", SEC_PLAYER, false, &HandlePhaseGetCommand, "", NULL },
|
||
|
|
{ "complete", SEC_PLAYER, false, &HandlePhaseCompleteCommand, "", NULL },
|
||
|
|
{ "addmember", SEC_PLAYER, false, &HandlePhaseAddMemberCommand, "", NULL },
|
||
|
|
{ "npcadd", SEC_PLAYER, false, &HandlePhaseAddNpcCommand, "", NULL },
|
||
|
|
{ "npcdelete", SEC_PLAYER, false, &HandlePhaseDeleteNpcCommand, "", NULL },
|
||
|
|
{ NULL, 0, false, NULL, "", NULL }
|
||
|
|
};
|
||
|
|
|
||
|
|
static ChatCommand phasecommandTable[] =
|
||
|
|
{
|
||
|
|
{ "phase", SEC_PLAYER, false, NULL, "", phaseCmdTable },
|
||
|
|
{ NULL, 0, false, NULL, "", NULL }
|
||
|
|
};
|
||
|
|
return phasecommandTable;
|
||
|
|
}
|
||
|
|
|
||
|
|
static bool HandlePhaseCreateCommand(ChatHandler * chat, const char * args)
|
||
|
|
{
|
||
|
|
if(!*args)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
Player * player = chat->GetSession()->GetPlayer();
|
||
|
|
|
||
|
|
uint32 phase = atoi((char*)args);
|
||
|
|
|
||
|
|
if(phase == 0) // If someone even joins on 0, then it will crash the server
|
||
|
|
return false;
|
||
|
|
else if(phase == 1) // Default is 1, if someone owned that, then everyone would be screwed xD
|
||
|
|
return false;
|
||
|
|
|
||
|
|
QueryResult get_phase = CharacterDatabase.PQuery("SELECT phase_owned FROM phase WHERE phase='%u'", phase);
|
||
|
|
QueryResult check = CharacterDatabase.PQuery("SELECT phase_owned FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
|
||
|
|
if(check)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * mfields = check->Fetch();
|
||
|
|
if(mfields[0].GetInt32() != 0)
|
||
|
|
{
|
||
|
|
chat->SendSysMessage("|cffFF0000You already have a phase!|r");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}while(check->NextRow());
|
||
|
|
}
|
||
|
|
|
||
|
|
if(get_phase)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = get_phase->Fetch();
|
||
|
|
if(phase == fields[0].GetInt32())
|
||
|
|
{
|
||
|
|
chat->SendSysMessage("|cffFF0000This phase has already been taken!|r");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}while(get_phase->NextRow());
|
||
|
|
}
|
||
|
|
|
||
|
|
CreatePhase(player, false, phase);
|
||
|
|
CreatePhase(player, true, phase);
|
||
|
|
player->SetPhaseMask(phase, true);
|
||
|
|
chat->SendSysMessage("|cff4169E1You have created your phase!|r \n |cffbbbbbb.phase join #|r - |cff00FF00is to join a phase.|r \n |cffbbbbbb.phase complete|r - |cff00FF00completes your phase for the public to join and see.|r");
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
static bool HandlePhaseJoinCommand(ChatHandler * chat, const char * args)
|
||
|
|
{
|
||
|
|
if(!*args)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
Player * player = chat->GetSession()->GetPlayer();
|
||
|
|
uint32 phase = (uint32)atoi((char*)args);
|
||
|
|
if(phase == 0)
|
||
|
|
return false;
|
||
|
|
else if (phase == 1)
|
||
|
|
{
|
||
|
|
player->SetPhaseMask(1, true);
|
||
|
|
chat->PSendSysMessage("|cff4169E1You are now entering phase 1.|r (Default Phase)");
|
||
|
|
}
|
||
|
|
|
||
|
|
QueryResult hasPhase = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
if(hasPhase)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = hasPhase->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
chat->PSendSysMessage("|cffFF0000You need to create a phase before joining one!|r", phase);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(hasPhase->NextRow());
|
||
|
|
}
|
||
|
|
|
||
|
|
QueryResult myPhase = CharacterDatabase.PQuery("SELECT get_phase FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
|
||
|
|
if(myPhase)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * mfield = myPhase->Fetch();
|
||
|
|
if(mfield[0].GetUInt32() == phase)
|
||
|
|
{
|
||
|
|
chat->PSendSysMessage("|cffFF0000You are already in phase %u!|r", phase);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(myPhase->NextRow());
|
||
|
|
}
|
||
|
|
|
||
|
|
QueryResult isCompleted = CharacterDatabase.PQuery("SELECT has_completed,guid,phase FROM phase WHERE phase='%u'", phase);
|
||
|
|
if(!isCompleted)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
if(isCompleted)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = isCompleted->Fetch();
|
||
|
|
if(fields[0].GetUInt16() == 1) // if the phase is completed
|
||
|
|
{
|
||
|
|
player->SetPhaseMask(phase, true);
|
||
|
|
CharacterDatabase.PExecute("UPDATE phase SET get_phase='%u' WHERE guid='%u'", phase, player->GetGUID());
|
||
|
|
chat->PSendSysMessage("|cff4169E1You are now entering phase %u.|r", phase);
|
||
|
|
}
|
||
|
|
else if(player->GetGUID() == fields[1].GetUInt64() && fields[2].GetUInt32() == phase)
|
||
|
|
{
|
||
|
|
player->SetPhaseMask(phase, true);
|
||
|
|
CharacterDatabase.PExecute("UPDATE phase SET get_phase='%u' WHERE guid='%u'", phase, player->GetGUID());
|
||
|
|
chat->PSendSysMessage("|cffffffffYou are now entering your own phase %u.|r", phase);
|
||
|
|
}
|
||
|
|
else // if the phase isn't completed
|
||
|
|
{
|
||
|
|
chat->PSendSysMessage("|cffFF0000This phase isn't completed yet!|r \n Phase: %u", phase);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(isCompleted->NextRow());
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
static bool HandlePhaseHelpCommand(ChatHandler * chat, const char * args)
|
||
|
|
{
|
||
|
|
Player * player = chat->GetSession()->GetPlayer();
|
||
|
|
char msg[1024];
|
||
|
|
snprintf(msg, 1024, "\n |cff00FF00 ~ Phase commands and information is below ~|r \n |cff008000.phase npcadd:|r |cff4169E1 Adds a npc.|r \n |cff008000.phase npcdelete:|r |cff4169E1 Deletes a npc.|r \n |cff008000.phase godelete:|r |cff4169E1 Deletes a gobject.|r \n |cff008000.phase gotarget:|r |cff4169E1 Targets a gobject.|r \n |cff008000.phase go:|r |cff4169E1 Spawns a gobject if you're allowed to.|r \n |cff008000.phase changeowner:|r |cff4169E1 Changes the phase's owner.|r \n |cff008000.phase addmember:|r |cff4169E1 Enables that player to build in your phase.|r \n |cff008000.phase create:|r |cff4169E1 Allows you to create a phase.|r \n |cff008000.phase join:|r |cff4169E1 Join a specified/completed phase.|r \n |cff008000.phase delete:|r |cff4169E1 Delete your created phase.|r \n |cff008000.phase kick:|r |cff4169E1 Kick a player from your phase.|r \n |cff008000.phase leave:|r |cff4169E1 Leave any phase to the default 0 phase.|r \n |cff008000.phase help:|r |cff4169E1 Shows you the commands and what they do.|r \n |cff008000.phase get:|r |cff4169E1 Gets the current phase you're in.|r \n |cff008000.phase kick:|r |cff4169E1 Kick a player from your phase.|r \n |cff008000.phase complete:|r |cff4169E1 After you finish your phase, completing it will set your phase to public.|r \n");
|
||
|
|
chat->SendSysMessage(msg);
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
static bool HandlePhaseDeleteCommand(ChatHandler * chat, const char * args)
|
||
|
|
{
|
||
|
|
Player * player = chat->GetSession()->GetPlayer();
|
||
|
|
|
||
|
|
player->SetPhaseMask(0, true);
|
||
|
|
QueryResult res = CharacterDatabase.PQuery("SELECT * FROM phase WHERE guid='%u' LIMIT 1", player->GetGUID());
|
||
|
|
if(!res)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
CharacterDatabase.PExecute("DELETE FROM phase WHERE (guid='%u')", player->GetGUID());
|
||
|
|
CharacterDatabase.PExecute("DELETE FROM phase_members WHERE (guid='%u')", player->GetGUID());
|
||
|
|
chat->SendSysMessage("|cffFFFF00Your phase has now been deleted.|r");
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
static bool HandlePhaseKickCommand(ChatHandler * chat, const char * args)
|
||
|
|
{
|
||
|
|
if(!*args)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
Player * player = chat->GetSession()->GetPlayer();
|
||
|
|
|
||
|
|
QueryResult phase = CharacterDatabase.PQuery("SELECT phase FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
if(!phase)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
if(phase)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = phase->Fetch();
|
||
|
|
QueryResult getplayer = CharacterDatabase.PQuery("SELECT get_phase FROM phase WHERE player_name='%s'", args);
|
||
|
|
if(!getplayer)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
char msg[255];
|
||
|
|
|
||
|
|
Field * mfields = getplayer->Fetch();
|
||
|
|
if(mfields[0].GetInt32() == fields[0].GetInt32())
|
||
|
|
{
|
||
|
|
Player * target = ObjectAccessor::FindPlayerByName(args);
|
||
|
|
target->SetPhaseMask(0, true);
|
||
|
|
snprintf(msg, 255, "|cffFF0000You were kicked from phase %u by %s!|r", fields[0].GetInt32(), player->GetName());
|
||
|
|
player->Whisper(msg, LANG_UNIVERSAL, player->GetGUID());
|
||
|
|
CharacterDatabase.PExecute("UPDATE phases SET get_phase='0' AND get_phase='0' WHERE (guid='%u')", player->GetGUID());
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
snprintf(msg, 255, "|cffFF0000%s is not currently in your phase!|r", args);
|
||
|
|
chat->SendSysMessage(msg);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(phase->NextRow());
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
static bool HandlePhaseGetCommand(ChatHandler * chat, const char * args)
|
||
|
|
{
|
||
|
|
Player * player = chat->GetSession()->GetPlayer();
|
||
|
|
QueryResult getPhaseAndOwnedPhase = CharacterDatabase.PQuery("SELECT COUNT(*),get_phase,phase FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
if(!getPhaseAndOwnedPhase)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
if(getPhaseAndOwnedPhase)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = getPhaseAndOwnedPhase->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
chat->SendSysMessage("|cffFF0000Could not get phase or owned phase.|r");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
chat->PSendSysMessage("|cffADD8E6Current Phase: %u \n Owned Phase: %u|r", fields[1].GetUInt32(), fields[2].GetUInt32());
|
||
|
|
}while(getPhaseAndOwnedPhase->NextRow());
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
static bool HandlePhaseCompleteCommand(ChatHandler * chat, const char * args)
|
||
|
|
{
|
||
|
|
if(!*args)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
Player * player = chat->GetSession()->GetPlayer();
|
||
|
|
uint8 yesorno = (uint8)atoi((char*)args);
|
||
|
|
if(!yesorno)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
if(yesorno > 1)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
QueryResult isOwnerOfAPhase = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
if(isOwnerOfAPhase)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = isOwnerOfAPhase->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
chat->SendSysMessage("|cffFF0000Could not complete phase.|r");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(isOwnerOfAPhase->NextRow());
|
||
|
|
}
|
||
|
|
if(yesorno == 1)
|
||
|
|
{
|
||
|
|
chat->SendSysMessage("|cffFFA500You have now completed your phase! It is open for public.|r");
|
||
|
|
CharacterDatabase.PExecute("UPDATE phase SET has_completed='1' WHERE guid='%u'", player->GetGUID());
|
||
|
|
}
|
||
|
|
else if(yesorno == 0)
|
||
|
|
{
|
||
|
|
chat->SendSysMessage("|cffADD8E6Please take your time.");
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
static bool HandlePhaseAddMemberCommand(ChatHandler * chat, const char * args)
|
||
|
|
{
|
||
|
|
if(!*args)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
uint32 ph = atoi((char*)args);
|
||
|
|
Player * player = chat->GetSession()->GetPlayer();
|
||
|
|
Player * target = chat->getSelectedPlayer();
|
||
|
|
|
||
|
|
if (!target)
|
||
|
|
{
|
||
|
|
chat->SendSysMessage(LANG_NO_CHAR_SELECTED);
|
||
|
|
chat->SetSentErrorMessage(true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(target == player)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
QueryResult isOwnerOfAPhase = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase WHERE player_name='%s'", target->GetName());
|
||
|
|
if(isOwnerOfAPhase)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = isOwnerOfAPhase->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
chat->PSendSysMessage("|cffFF0000 %s does not own a phase; therefore, he/she cannot be added to your phase.|r", target->GetName());
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(isOwnerOfAPhase->NextRow());
|
||
|
|
}
|
||
|
|
QueryResult isMember = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase_members WHERE player_name='%s' AND phase='%u'", target->GetName(), ph);
|
||
|
|
if(isMember)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * field = isMember->Fetch();
|
||
|
|
if(field[0].GetInt32() == 1)
|
||
|
|
{
|
||
|
|
chat->PSendSysMessage("|cffFF0000 %s is already a member of your phase!|r", target->GetName());
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(isMember->NextRow());
|
||
|
|
}
|
||
|
|
QueryResult isOwner = CharacterDatabase.PQuery("SELECT phase_owned FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
if(isOwner)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * mfield = isOwner->Fetch();
|
||
|
|
if(ph != mfield[0].GetUInt32())
|
||
|
|
{
|
||
|
|
chat->PSendSysMessage("|cffFF0000You cannot add yourself or anyone else to someone elses phase.|r");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(isOwner->NextRow());
|
||
|
|
}
|
||
|
|
chat->PSendSysMessage("|cffFFA500You successfully added %s to your phase %u.|r", target->GetName(), ph);
|
||
|
|
CreatePhase(target, true, ph);
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
#ifndef _PHASE_GO_COMMANDS_
|
||
|
|
static bool HandlePhaseGoCommand(ChatHandler * handler, const char * args)
|
||
|
|
{
|
||
|
|
if (!*args)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
// number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r
|
||
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject_entry");
|
||
|
|
if (!id)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
uint32 objectId = atol(id);
|
||
|
|
if (!objectId)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
char* phasing = strtok(NULL, " ");
|
||
|
|
|
||
|
|
const GameObjectTemplate* objectInfo = sObjectMgr->GetGameObjectTemplate(objectId);
|
||
|
|
|
||
|
|
if (!objectInfo)
|
||
|
|
{
|
||
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST, objectId);
|
||
|
|
handler->SetSentErrorMessage(true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (objectInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(objectInfo->displayId))
|
||
|
|
{
|
||
|
|
// report to DB errors log as in loading case
|
||
|
|
sLog->outErrorDb("Gameobject (Entry %u GoType: %u) have invalid displayId (%u), not spawned.", objectId, objectInfo->type, objectInfo->displayId);
|
||
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_HAVE_INVALID_DATA, objectId);
|
||
|
|
handler->SetSentErrorMessage(true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
Player* player = handler->GetSession()->GetPlayer();
|
||
|
|
float x = float(player->GetPositionX());
|
||
|
|
float y = float(player->GetPositionY());
|
||
|
|
float z = float(player->GetPositionZ());
|
||
|
|
float o = float(player->GetOrientation());
|
||
|
|
Map* map = player->GetMap();
|
||
|
|
|
||
|
|
GameObject* object = new GameObject;
|
||
|
|
uint32 guidLow = sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT);
|
||
|
|
|
||
|
|
if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))
|
||
|
|
{
|
||
|
|
delete object;
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (phasing)
|
||
|
|
{
|
||
|
|
uint32 value = atoi((char*)phasing);
|
||
|
|
|
||
|
|
if(value == 0)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
QueryResult res;
|
||
|
|
res = CharacterDatabase.PQuery("SELECT get_phase FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
if(res)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = res->Fetch();
|
||
|
|
uint32 val = fields[0].GetUInt32();
|
||
|
|
if(val != value)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You are not in this phase!");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
QueryResult result;
|
||
|
|
result = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase_members WHERE guid='%u' AND phase='1' LIMIT 1",
|
||
|
|
player->GetGUID(), (uint32)val);
|
||
|
|
|
||
|
|
if(result)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = result->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You must be added to this phase before you can build.");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(result->NextRow());
|
||
|
|
}
|
||
|
|
}while(res->NextRow());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// fill the gameobject data and save to the db
|
||
|
|
object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn());
|
||
|
|
|
||
|
|
// this will generate a new guid if the object is in an instance
|
||
|
|
if (!object->LoadGameObjectFromDB(guidLow, map))
|
||
|
|
{
|
||
|
|
delete object;
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// TODO: is it really necessary to add both the real and DB table guid here ?
|
||
|
|
sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGOData(guidLow));
|
||
|
|
|
||
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_ADD, objectId, objectInfo->name.c_str(), guidLow, x, y, z);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
static bool HandlePhaseGoTargetCommand(ChatHandler * handler, const char * args)
|
||
|
|
{
|
||
|
|
Player* pl = handler->GetSession()->GetPlayer();
|
||
|
|
|
||
|
|
QueryResult result;
|
||
|
|
GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
|
||
|
|
if (*args)
|
||
|
|
{
|
||
|
|
char* cId = handler->extractKeyFromLink((char*)args, "Hgameobject_entry");
|
||
|
|
if (!cId)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
uint32 id = atol(cId);
|
||
|
|
char* phasing = strtok(NULL, " ");
|
||
|
|
if(!phasing)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
if (id)
|
||
|
|
result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE map = '%i' AND id = '%u' ORDER BY order_ ASC LIMIT 1",
|
||
|
|
pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), pl->GetMapId(), id);
|
||
|
|
else
|
||
|
|
{
|
||
|
|
std::string name = cId;
|
||
|
|
WorldDatabase.EscapeString(name);
|
||
|
|
result = WorldDatabase.PQuery(
|
||
|
|
"SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ "
|
||
|
|
"FROM gameobject, gameobject_template WHERE gameobject_template.entry = gameobject.id AND map = %i AND name "_LIKE_" "_CONCAT3_("'%%'", "'%s'", "'%%'")" ORDER BY order_ ASC LIMIT 1",
|
||
|
|
pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), pl->GetMapId(), name.c_str());
|
||
|
|
}
|
||
|
|
|
||
|
|
if (phasing)
|
||
|
|
{
|
||
|
|
uint32 value = atoi((char*)phasing);
|
||
|
|
|
||
|
|
if(value == 0)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
QueryResult res;
|
||
|
|
res = CharacterDatabase.PQuery("SELECT get_phase FROM phase WHERE guid='%u'", pl->GetGUID());
|
||
|
|
if(res)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = res->Fetch();
|
||
|
|
uint32 val = fields[0].GetUInt32();
|
||
|
|
if(val != value)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You are not in this phase!");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
QueryResult result;
|
||
|
|
result = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase_members WHERE guid='%u' AND phase='1' LIMIT 1",
|
||
|
|
pl->GetGUID(), (uint32)val);
|
||
|
|
|
||
|
|
if(result)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = result->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You must be added to this phase before you can target a go.");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(result->NextRow());
|
||
|
|
}
|
||
|
|
}while(res->NextRow());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
std::ostringstream eventFilter;
|
||
|
|
eventFilter << " AND (eventEntry IS NULL ";
|
||
|
|
bool initString = true;
|
||
|
|
|
||
|
|
for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
|
||
|
|
{
|
||
|
|
if (initString)
|
||
|
|
{
|
||
|
|
eventFilter << "OR eventEntry IN (" <<*itr;
|
||
|
|
initString =false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
eventFilter << ", " << *itr;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!initString)
|
||
|
|
eventFilter << "))";
|
||
|
|
else
|
||
|
|
eventFilter << ")";
|
||
|
|
|
||
|
|
result = WorldDatabase.PQuery("SELECT gameobject.guid, id, position_x, position_y, position_z, orientation, map, phaseMask, "
|
||
|
|
"(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject "
|
||
|
|
"LEFT OUTER JOIN game_event_gameobject on gameobject.guid = game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10",
|
||
|
|
handler->GetSession()->GetPlayer()->GetPositionX(), handler->GetSession()->GetPlayer()->GetPositionY(), handler->GetSession()->GetPlayer()->GetPositionZ(),
|
||
|
|
handler->GetSession()->GetPlayer()->GetMapId(), eventFilter.str().c_str());
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!result)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage(LANG_COMMAND_TARGETOBJNOTFOUND);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool found = false;
|
||
|
|
float x, y, z, o;
|
||
|
|
uint32 lowguid, id;
|
||
|
|
uint16 mapid, phase;
|
||
|
|
uint32 pool_id;
|
||
|
|
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field *fields = result->Fetch();
|
||
|
|
lowguid = fields[0].GetUInt32();
|
||
|
|
id = fields[1].GetUInt32();
|
||
|
|
x = fields[2].GetFloat();
|
||
|
|
y = fields[3].GetFloat();
|
||
|
|
z = fields[4].GetFloat();
|
||
|
|
o = fields[5].GetFloat();
|
||
|
|
mapid = fields[6].GetUInt16();
|
||
|
|
phase = fields[7].GetUInt16();
|
||
|
|
pool_id = sPoolMgr->IsPartOfAPool<GameObject>(lowguid);
|
||
|
|
if (!pool_id || sPoolMgr->IsSpawnedObject<GameObject>(lowguid))
|
||
|
|
found = true;
|
||
|
|
} while (result->NextRow() && (!found));
|
||
|
|
|
||
|
|
if (!found)
|
||
|
|
{
|
||
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST, id);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
GameObjectTemplate const* goI = sObjectMgr->GetGameObjectTemplate(id);
|
||
|
|
|
||
|
|
if (!goI)
|
||
|
|
{
|
||
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST, id);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
GameObject* target = handler->GetSession()->GetPlayer()->GetMap()->GetGameObject(MAKE_NEW_GUID(lowguid, id, HIGHGUID_GAMEOBJECT));
|
||
|
|
|
||
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_DETAIL, lowguid, goI->name.c_str(), lowguid, id, x, y, z, mapid, o, phase);
|
||
|
|
|
||
|
|
if (target)
|
||
|
|
{
|
||
|
|
int32 curRespawnDelay = int32(target->GetRespawnTimeEx()-time(NULL));
|
||
|
|
if (curRespawnDelay < 0)
|
||
|
|
curRespawnDelay = 0;
|
||
|
|
|
||
|
|
std::string curRespawnDelayStr = secsToTimeString(curRespawnDelay, true);
|
||
|
|
std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), true);
|
||
|
|
|
||
|
|
handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
static bool HandlePhaseGoDeleteCommand(ChatHandler * handler, const char * args)
|
||
|
|
{
|
||
|
|
if(!*args)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
Player * player = handler->GetSession()->GetPlayer();
|
||
|
|
|
||
|
|
char* cId = handler->extractKeyFromLink((char*)args, "Hgameobject");
|
||
|
|
if (!cId)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
uint32 lowguid = atoi(cId);
|
||
|
|
if (!lowguid)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
char* phasing = strtok(NULL, " ");
|
||
|
|
if(!phasing)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
GameObject* obj = NULL;
|
||
|
|
|
||
|
|
if (GameObjectData const* go_data = sObjectMgr->GetGOData(lowguid))
|
||
|
|
obj = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid, go_data->id);
|
||
|
|
|
||
|
|
if (!obj)
|
||
|
|
{
|
||
|
|
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid);
|
||
|
|
handler->SetSentErrorMessage(true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (phasing)
|
||
|
|
{
|
||
|
|
uint32 value = atoi((char*)phasing);
|
||
|
|
|
||
|
|
if(value == 0)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
QueryResult res;
|
||
|
|
res = CharacterDatabase.PQuery("SELECT get_phase FROM phase WHERE guid='%u'", player->GetGUID());
|
||
|
|
if(res)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = res->Fetch();
|
||
|
|
uint32 val = fields[0].GetUInt32();
|
||
|
|
if(val != value)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You are not in this phase!");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
QueryResult result;
|
||
|
|
result = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase_members WHERE guid='%u' AND phase='1' LIMIT 1",
|
||
|
|
player->GetGUID(), (uint32)val);
|
||
|
|
|
||
|
|
if(result)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = result->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You must be added to this phase before you can delete an object.");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(result->NextRow());
|
||
|
|
}
|
||
|
|
}while(res->NextRow());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
uint64 owner_guid = obj->GetOwnerGUID();
|
||
|
|
if (owner_guid)
|
||
|
|
{
|
||
|
|
Unit* owner = ObjectAccessor::GetUnit(*handler->GetSession()->GetPlayer(), owner_guid);
|
||
|
|
if (!owner || !IS_PLAYER_GUID(owner_guid))
|
||
|
|
{
|
||
|
|
handler->PSendSysMessage(LANG_COMMAND_DELOBJREFERCREATURE, GUID_LOPART(owner_guid), obj->GetGUIDLow());
|
||
|
|
handler->SetSentErrorMessage(true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
owner->RemoveGameObject(obj, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
obj->SetRespawnTime(0); // not save respawn time
|
||
|
|
obj->Delete();
|
||
|
|
obj->DeleteFromDB();
|
||
|
|
handler->PSendSysMessage(LANG_COMMAND_DELOBJMESSAGE, obj->GetGUIDLow());
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifndef _PHASE_NPC_COMMANDS_
|
||
|
|
static bool HandlePhaseAddNpcCommand(ChatHandler* handler, const char* args)
|
||
|
|
{
|
||
|
|
if (!*args)
|
||
|
|
return false;
|
||
|
|
char* charID = handler->extractKeyFromLink((char*)args, "Hcreature_entry");
|
||
|
|
if (!charID)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
char * phase = strtok(NULL, " ");
|
||
|
|
|
||
|
|
char* team = strtok(NULL, " ");
|
||
|
|
int32 teamval = 0;
|
||
|
|
if (team) { teamval = atoi(team); }
|
||
|
|
if (teamval < 0) { teamval = 0; }
|
||
|
|
|
||
|
|
uint32 id = atoi(charID);
|
||
|
|
|
||
|
|
Player* chr = handler->GetSession()->GetPlayer();
|
||
|
|
float x = chr->GetPositionX();
|
||
|
|
float y = chr->GetPositionY();
|
||
|
|
float z = chr->GetPositionZ();
|
||
|
|
float o = chr->GetOrientation();
|
||
|
|
Map* map = chr->GetMap();
|
||
|
|
|
||
|
|
if (chr->GetTransport())
|
||
|
|
{
|
||
|
|
uint32 tguid = chr->GetTransport()->AddNPCPassenger(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
|
||
|
|
if (tguid > 0)
|
||
|
|
WorldDatabase.PQuery("INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (%u, %u, %f, %f, %f, %f, %u)", tguid, id, chr->GetTransport()->GetEntry(), chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
Creature* creature = new Creature;
|
||
|
|
if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o))
|
||
|
|
{
|
||
|
|
delete creature;
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(phase)
|
||
|
|
{
|
||
|
|
uint32 value = atoi((char*)phase);
|
||
|
|
|
||
|
|
if(value == 0)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
QueryResult res;
|
||
|
|
res = CharacterDatabase.PQuery("SELECT get_phase FROM phase WHERE guid='%u'", chr->GetGUID());
|
||
|
|
if(res)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = res->Fetch();
|
||
|
|
uint32 val = fields[0].GetUInt32();
|
||
|
|
if(val != value)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You are not in this phase!");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
QueryResult result;
|
||
|
|
result = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase_members WHERE guid='%u' AND phase='1' LIMIT 1",
|
||
|
|
chr->GetGUID(), (uint32)val);
|
||
|
|
|
||
|
|
if(result)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = result->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You must be added to this phase before you can build.");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(result->NextRow());
|
||
|
|
}
|
||
|
|
}while(res->NextRow());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
|
||
|
|
|
||
|
|
uint32 db_guid = creature->GetDBTableGUIDLow();
|
||
|
|
|
||
|
|
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
|
||
|
|
if (!creature->LoadCreatureFromDB(db_guid, map))
|
||
|
|
{
|
||
|
|
delete creature;
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
sObjectMgr->AddCreatureToGrid(db_guid, sObjectMgr->GetCreatureData(db_guid));
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
static bool HandlePhaseDeleteNpcCommand(ChatHandler * handler, const char * args)
|
||
|
|
{
|
||
|
|
Creature* unit = NULL;
|
||
|
|
Player * pl = handler->GetSession()->GetPlayer();
|
||
|
|
if (*args)
|
||
|
|
{
|
||
|
|
char * phase = strtok(NULL, " ");
|
||
|
|
if(!phase)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
if(phase)
|
||
|
|
{
|
||
|
|
uint32 value = atoi((char*)phase);
|
||
|
|
if(value == 0)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
QueryResult res;
|
||
|
|
res = CharacterDatabase.PQuery("SELECT get_phase FROM phase WHERE guid='%u'", pl->GetGUID());
|
||
|
|
if(res)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = res->Fetch();
|
||
|
|
uint32 val = fields[0].GetUInt32();
|
||
|
|
if(val != value)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You are not in this phase!");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
QueryResult result;
|
||
|
|
result = CharacterDatabase.PQuery("SELECT COUNT(*) FROM phase_members WHERE guid='%u' AND phase='1' LIMIT 1",
|
||
|
|
pl->GetGUID(), (uint32)val);
|
||
|
|
|
||
|
|
if(result)
|
||
|
|
{
|
||
|
|
do
|
||
|
|
{
|
||
|
|
Field * fields = result->Fetch();
|
||
|
|
if(fields[0].GetInt32() == 0)
|
||
|
|
{
|
||
|
|
handler->SendSysMessage("You must be added to this phase before you can target a go.");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}while(result->NextRow());
|
||
|
|
}
|
||
|
|
}while(res->NextRow());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
unit = handler->getSelectedCreature();
|
||
|
|
|
||
|
|
if (!unit || unit->isPet() || unit->isTotem())
|
||
|
|
{
|
||
|
|
handler->SendSysMessage(LANG_SELECT_CREATURE);
|
||
|
|
handler->SetSentErrorMessage(true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Delete the creature
|
||
|
|
unit->CombatStop();
|
||
|
|
unit->DeleteFromDB();
|
||
|
|
unit->AddObjectToRemoveList();
|
||
|
|
|
||
|
|
handler->SendSysMessage(LANG_COMMAND_DELCREATMESSAGE);
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
};
|
||
|
|
|
||
|
|
void AddSC_system_phase()
|
||
|
|
{
|
||
|
|
new phasing_system;
|
||
|
|
}
|