2010-11-09 10:15:35 -05:00
/*
2012-12-31 23:15:50 +01:00
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
2010-11-09 10:15:35 -05:00
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
Name: npc_commandscript
%Complete: 100
Comment: All npc related commands
Category: commandscripts
EndScriptData */
2010-11-13 22:29:46 +01:00
#include "ScriptMgr.h"
#include "ObjectMgr.h"
#include "Chat.h"
2010-11-09 10:15:35 -05:00
#include "Transport.h"
#include "CreatureGroups.h"
2012-11-20 12:30:30 +01:00
#include "Language.h"
2010-11-09 10:15:35 -05:00
#include "TargetedMovementGenerator.h" // for HandleNpcUnFollowCommand
2012-05-09 12:14:31 -04:00
#include "CreatureAI.h"
2012-11-17 05:18:37 +01:00
#include "Player.h"
2012-11-20 12:30:30 +01:00
#include "Pet.h"
2010-11-09 10:15:35 -05:00
2013-01-19 19:17:31 +01:00
struct NpcFlagText
{
uint32 flag ;
int32 text ;
};
#define NPCFLAG_COUNT 24
const NpcFlagText npcFlagTexts [ NPCFLAG_COUNT ] =
{
{ UNIT_NPC_FLAG_AUCTIONEER , LANG_NPCINFO_AUCTIONEER },
{ UNIT_NPC_FLAG_BANKER , LANG_NPCINFO_BANKER },
{ UNIT_NPC_FLAG_BATTLEMASTER , LANG_NPCINFO_BATTLEMASTER },
{ UNIT_NPC_FLAG_FLIGHTMASTER , LANG_NPCINFO_FLIGHTMASTER },
{ UNIT_NPC_FLAG_GOSSIP , LANG_NPCINFO_GOSSIP },
{ UNIT_NPC_FLAG_GUILD_BANKER , LANG_NPCINFO_GUILD_BANKER },
{ UNIT_NPC_FLAG_INNKEEPER , LANG_NPCINFO_INNKEEPER },
{ UNIT_NPC_FLAG_PETITIONER , LANG_NPCINFO_PETITIONER },
{ UNIT_NPC_FLAG_PLAYER_VEHICLE , LANG_NPCINFO_PLAYER_VEHICLE },
{ UNIT_NPC_FLAG_QUESTGIVER , LANG_NPCINFO_QUESTGIVER },
{ UNIT_NPC_FLAG_REPAIR , LANG_NPCINFO_REPAIR },
{ UNIT_NPC_FLAG_SPELLCLICK , LANG_NPCINFO_SPELLCLICK },
{ UNIT_NPC_FLAG_SPIRITGUIDE , LANG_NPCINFO_SPIRITGUIDE },
{ UNIT_NPC_FLAG_SPIRITHEALER , LANG_NPCINFO_SPIRITHEALER },
{ UNIT_NPC_FLAG_STABLEMASTER , LANG_NPCINFO_STABLEMASTER },
{ UNIT_NPC_FLAG_TABARDDESIGNER , LANG_NPCINFO_TABARDDESIGNER },
{ UNIT_NPC_FLAG_TRAINER , LANG_NPCINFO_TRAINER },
{ UNIT_NPC_FLAG_TRAINER_CLASS , LANG_NPCINFO_TRAINER_CLASS },
{ UNIT_NPC_FLAG_TRAINER_PROFESSION , LANG_NPCINFO_TRAINER_PROFESSION },
{ UNIT_NPC_FLAG_VENDOR , LANG_NPCINFO_VENDOR },
{ UNIT_NPC_FLAG_VENDOR_AMMO , LANG_NPCINFO_VENDOR_AMMO },
{ UNIT_NPC_FLAG_VENDOR_FOOD , LANG_NPCINFO_VENDOR_FOOD },
{ UNIT_NPC_FLAG_VENDOR_POISON , LANG_NPCINFO_VENDOR_POISON },
{ UNIT_NPC_FLAG_VENDOR_REAGENT , LANG_NPCINFO_VENDOR_REAGENT }
};
2010-11-09 10:15:35 -05:00
class npc_commandscript : public CommandScript
{
2010-11-19 14:04:21 +01:00
public :
npc_commandscript () : CommandScript ( "npc_commandscript" ) { }
2010-11-09 10:15:35 -05:00
2013-07-06 20:21:45 +01:00
ChatCommand * GetCommands () const OVERRIDE
2010-11-19 14:04:21 +01:00
{
static ChatCommand npcAddCommandTable [] =
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
{ "formation" , SEC_MODERATOR , false , & HandleNpcAddFormationCommand , "" , NULL },
{ "item" , SEC_GAMEMASTER , false , & HandleNpcAddVendorItemCommand , "" , NULL },
{ "move" , SEC_GAMEMASTER , false , & HandleNpcAddMoveCommand , "" , NULL },
{ "temp" , SEC_GAMEMASTER , false , & HandleNpcAddTempSpawnCommand , "" , NULL },
2013-03-08 21:41:30 +01:00
//{@todo fix or remove this command
2010-11-19 14:04:21 +01:00
{ "weapon" , SEC_ADMINISTRATOR , false , & HandleNpcAddWeaponCommand , "" , NULL },
//}
{ "" , SEC_GAMEMASTER , false , & HandleNpcAddCommand , "" , NULL },
2012-10-24 13:29:34 +02:00
{ NULL , SEC_PLAYER , false , NULL , "" , NULL }
2010-11-19 14:04:21 +01:00
};
static ChatCommand npcDeleteCommandTable [] =
{
{ "item" , SEC_GAMEMASTER , false , & HandleNpcDeleteVendorItemCommand , "" , NULL },
{ "" , SEC_GAMEMASTER , false , & HandleNpcDeleteCommand , "" , NULL },
2012-10-24 13:29:34 +02:00
{ NULL , SEC_PLAYER , false , NULL , "" , NULL }
2010-11-19 14:04:21 +01:00
};
static ChatCommand npcFollowCommandTable [] =
{
{ "stop" , SEC_GAMEMASTER , false , & HandleNpcUnFollowCommand , "" , NULL },
{ "" , SEC_GAMEMASTER , false , & HandleNpcFollowCommand , "" , NULL },
2012-10-24 13:29:34 +02:00
{ NULL , SEC_PLAYER , false , NULL , "" , NULL }
2010-11-19 14:04:21 +01:00
};
static ChatCommand npcSetCommandTable [] =
{
{ "allowmove" , SEC_ADMINISTRATOR , false , & HandleNpcSetAllowMovementCommand , "" , NULL },
{ "entry" , SEC_ADMINISTRATOR , false , & HandleNpcSetEntryCommand , "" , NULL },
{ "factionid" , SEC_GAMEMASTER , false , & HandleNpcSetFactionIdCommand , "" , NULL },
{ "flag" , SEC_GAMEMASTER , false , & HandleNpcSetFlagCommand , "" , NULL },
{ "level" , SEC_GAMEMASTER , false , & HandleNpcSetLevelCommand , "" , NULL },
{ "link" , SEC_GAMEMASTER , false , & HandleNpcSetLinkCommand , "" , NULL },
{ "model" , SEC_GAMEMASTER , false , & HandleNpcSetModelCommand , "" , NULL },
{ "movetype" , SEC_GAMEMASTER , false , & HandleNpcSetMoveTypeCommand , "" , NULL },
{ "phase" , SEC_GAMEMASTER , false , & HandleNpcSetPhaseCommand , "" , NULL },
{ "spawndist" , SEC_GAMEMASTER , false , & HandleNpcSetSpawnDistCommand , "" , NULL },
{ "spawntime" , SEC_GAMEMASTER , false , & HandleNpcSetSpawnTimeCommand , "" , NULL },
2012-05-09 10:07:18 -04:00
{ "data" , SEC_ADMINISTRATOR , false , & HandleNpcSetDataCommand , "" , NULL },
2013-03-08 21:41:30 +01:00
//{ @todo fix or remove these commands
2010-11-19 14:04:21 +01:00
{ "name" , SEC_GAMEMASTER , false , & HandleNpcSetNameCommand , "" , NULL },
{ "subname" , SEC_GAMEMASTER , false , & HandleNpcSetSubNameCommand , "" , NULL },
//}
2012-10-24 13:29:34 +02:00
{ NULL , SEC_PLAYER , false , NULL , "" , NULL }
2010-11-19 14:04:21 +01:00
};
static ChatCommand npcCommandTable [] =
{
{ "info" , SEC_ADMINISTRATOR , false , & HandleNpcInfoCommand , "" , NULL },
2012-12-30 17:09:55 +01:00
{ "near" , SEC_GAMEMASTER , false , & HandleNpcNearCommand , "" , NULL },
2010-11-19 14:04:21 +01:00
{ "move" , SEC_GAMEMASTER , false , & HandleNpcMoveCommand , "" , NULL },
{ "playemote" , SEC_ADMINISTRATOR , false , & HandleNpcPlayEmoteCommand , "" , NULL },
{ "say" , SEC_MODERATOR , false , & HandleNpcSayCommand , "" , NULL },
{ "textemote" , SEC_MODERATOR , false , & HandleNpcTextEmoteCommand , "" , NULL },
{ "whisper" , SEC_MODERATOR , false , & HandleNpcWhisperCommand , "" , NULL },
{ "yell" , SEC_MODERATOR , false , & HandleNpcYellCommand , "" , NULL },
{ "tame" , SEC_GAMEMASTER , false , & HandleNpcTameCommand , "" , NULL },
{ "add" , SEC_GAMEMASTER , false , NULL , "" , npcAddCommandTable },
{ "delete" , SEC_GAMEMASTER , false , NULL , "" , npcDeleteCommandTable },
{ "follow" , SEC_GAMEMASTER , false , NULL , "" , npcFollowCommandTable },
{ "set" , SEC_GAMEMASTER , false , NULL , "" , npcSetCommandTable },
2012-10-24 13:29:34 +02:00
{ NULL , SEC_PLAYER , false , NULL , "" , NULL }
2010-11-19 14:04:21 +01:00
};
static ChatCommand commandTable [] =
{
{ "npc" , SEC_MODERATOR , false , NULL , "" , npcCommandTable },
2012-10-24 13:29:34 +02:00
{ NULL , SEC_PLAYER , false , NULL , "" , NULL }
2010-11-19 14:04:21 +01:00
};
return commandTable ;
}
//add spawn of creature
2012-10-24 13:29:34 +02:00
static bool HandleNpcAddCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2012-03-16 19:40:57 +08:00
2011-04-29 20:47:02 +02:00
char * charID = handler -> extractKeyFromLink (( char * ) args , "Hcreature_entry" );
2010-11-19 14:04:21 +01:00
if ( ! charID )
return false ;
char * team = strtok ( NULL , " " );
int32 teamval = 0 ;
if ( team ) { teamval = atoi ( team ); }
if ( teamval < 0 ) { teamval = 0 ; }
uint32 id = atoi ( charID );
2011-06-30 14:24:56 +02:00
Player * chr = handler -> GetSession () -> GetPlayer ();
2010-11-19 14:04:21 +01:00
float x = chr -> GetPositionX ();
float y = chr -> GetPositionY ();
float z = chr -> GetPositionZ ();
float o = chr -> GetOrientation ();
2011-09-15 14:08:17 +02:00
Map * map = chr -> GetMap ();
2010-11-19 14:04:21 +01:00
if ( chr -> GetTransport ())
{
uint32 tguid = chr -> GetTransport () -> AddNPCPassenger ( 0 , id , chr -> GetTransOffsetX (), chr -> GetTransOffsetY (), chr -> GetTransOffsetZ (), chr -> GetTransOffsetO ());
if ( tguid > 0 )
2012-03-19 16:48:08 +01:00
{
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_INS_CREATURE_TRANSPORT );
stmt -> setInt32 ( 0 , int32 ( tguid ));
stmt -> setInt32 ( 1 , int32 ( id ));
stmt -> setInt32 ( 2 , int32 ( chr -> GetTransport () -> GetEntry ()));
stmt -> setFloat ( 3 , chr -> GetTransOffsetX ());
stmt -> setFloat ( 4 , chr -> GetTransOffsetY ());
stmt -> setFloat ( 5 , chr -> GetTransOffsetZ ());
stmt -> setFloat ( 6 , chr -> GetTransOffsetO ());
WorldDatabase . Execute ( stmt );
}
2010-11-19 14:04:21 +01:00
return true ;
2010-11-09 10:15:35 -05:00
}
2012-03-16 19:40:57 +08:00
Creature * creature = new Creature ();
2012-09-26 17:46:00 +02:00
if ( ! creature -> Create ( sObjectMgr -> GenerateLowGuid ( HIGHGUID_UNIT ), map , chr -> GetPhaseMgr (). GetPhaseMaskForSpawn (), id , 0 , ( uint32 ) teamval , x , y , z , o ))
2010-11-09 10:15:35 -05:00
{
2011-07-02 22:18:03 +02:00
delete creature ;
2010-11-19 14:04:21 +01:00
return false ;
}
2010-11-09 10:15:35 -05:00
2012-09-26 17:46:00 +02:00
creature -> SaveToDB ( map -> GetId (), ( 1 << map -> GetSpawnMode ()), chr -> GetPhaseMgr (). GetPhaseMaskForSpawn ());
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
uint32 db_guid = creature -> GetDBTableGUIDLow ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
2011-11-28 14:05:25 -05:00
if ( ! creature -> LoadCreatureFromDB ( db_guid , map ))
{
delete creature ;
return false ;
}
2010-11-09 10:15:35 -05:00
2010-12-22 21:25:23 +01:00
sObjectMgr -> AddCreatureToGrid ( db_guid , sObjectMgr -> GetCreatureData ( db_guid ));
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//add item in vendorlist
2011-10-31 09:17:45 +01:00
static bool HandleNpcAddVendorItemCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2012-08-14 18:11:06 +01:00
const uint8 type = 1 ; // FIXME: make type (1 item, 2 currency) an argument
2012-03-14 18:51:51 +01:00
char * pitem = handler -> extractKeyFromLink (( char * ) args , "Hitem" );
if ( ! pitem )
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_COMMAND_NEEDITEMSEND );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2012-03-14 18:51:51 +01:00
int32 item_int = atol ( pitem );
2011-10-31 00:02:32 +01:00
if ( item_int <= 0 )
2011-10-31 09:17:45 +01:00
return false ;
2011-10-31 00:02:32 +01:00
uint32 itemId = item_int ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
char * fmaxcount = strtok ( NULL , " " ); //add maxcount, default: 0
uint32 maxcount = 0 ;
if ( fmaxcount )
maxcount = atol ( fmaxcount );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
char * fincrtime = strtok ( NULL , " " ); //add incrtime, default: 0
uint32 incrtime = 0 ;
if ( fincrtime )
incrtime = atol ( fincrtime );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
char * fextendedcost = strtok ( NULL , " " ); //add ExtendedCost, default: 0
uint32 extendedcost = fextendedcost ? atol ( fextendedcost ) : 0 ;
Creature * vendor = handler -> getSelectedCreature ();
if ( ! vendor )
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2013-05-19 11:15:54 +02:00
uint32 vendor_entry = vendor -> GetEntry ();
2010-11-19 14:04:21 +01:00
2012-08-14 18:11:06 +01:00
if ( ! sObjectMgr -> IsVendorItemValid ( vendor_entry , itemId , maxcount , incrtime , extendedcost , type , handler -> GetSession () -> GetPlayer ()))
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2012-11-16 23:23:38 +02:00
sObjectMgr -> AddVendorItem ( vendor_entry , itemId , maxcount , incrtime , extendedcost , type );
2010-11-09 10:15:35 -05:00
2011-04-28 22:42:33 +02:00
ItemTemplate const * itemTemplate = sObjectMgr -> GetItemTemplate ( itemId );
2010-11-09 10:15:35 -05:00
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_ITEM_ADDED_TO_LIST , itemId , itemTemplate -> Name1 . c_str (), maxcount , incrtime , extendedcost );
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//add move for creature
2012-10-24 13:29:34 +02:00
static bool HandleNpcAddMoveCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2011-12-31 00:32:05 +01:00
char * guidStr = strtok (( char * ) args , " " );
char * waitStr = strtok (( char * ) NULL , " " );
2010-11-19 14:04:21 +01:00
2011-12-31 00:32:05 +01:00
uint32 lowGuid = atoi (( char * ) guidStr );
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = NULL ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
/* FIXME: impossible without entry
if (lowguid)
2011-07-02 22:18:03 +02:00
creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), MAKE_GUID(lowguid, HIGHGUID_UNIT));
2010-11-19 14:04:21 +01:00
*/
// attempt check creature existence by DB data
2011-07-02 22:18:03 +02:00
if ( ! creature )
2010-11-19 14:04:21 +01:00
{
2011-12-31 00:32:05 +01:00
CreatureData const * data = sObjectMgr -> GetCreatureData ( lowGuid );
2010-11-19 14:04:21 +01:00
if ( ! data )
2010-11-09 10:15:35 -05:00
{
2011-12-31 00:32:05 +01:00
handler -> PSendSysMessage ( LANG_COMMAND_CREATGUIDNOTFOUND , lowGuid );
2010-11-09 10:15:35 -05:00
handler -> SetSentErrorMessage ( true );
return false ;
}
}
2010-11-19 14:04:21 +01:00
else
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
// obtain real GUID for DB operations
2011-12-31 00:32:05 +01:00
lowGuid = creature -> GetDBTableGUIDLow ();
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2011-12-31 00:32:05 +01:00
int wait = waitStr ? atoi ( waitStr ) : 0 ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( wait < 0 )
wait = 0 ;
2010-11-09 10:15:35 -05:00
2011-12-31 00:32:05 +01:00
// Update movement type
2011-12-31 19:06:24 +01:00
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_UPD_CREATURE_MOVEMENT_TYPE );
2010-11-09 10:15:35 -05:00
2011-12-31 00:32:05 +01:00
stmt -> setUInt8 ( 0 , uint8 ( WAYPOINT_MOTION_TYPE ));
stmt -> setUInt32 ( 1 , lowGuid );
2011-12-31 19:06:24 +01:00
WorldDatabase . Execute ( stmt );
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( creature && creature -> GetWaypointPath ())
2010-11-19 14:04:21 +01:00
{
2011-07-02 22:18:03 +02:00
creature -> SetDefaultMovementType ( WAYPOINT_MOTION_TYPE );
creature -> GetMotionMaster () -> Initialize ();
2013-06-11 19:54:27 -02:30
if ( creature -> IsAlive ()) // dead creature will reset movement generator at respawn
2010-11-09 10:15:35 -05:00
{
2011-07-02 22:18:03 +02:00
creature -> setDeathState ( JUST_DIED );
creature -> Respawn ( true );
2010-11-09 10:15:35 -05:00
}
2011-07-02 22:18:03 +02:00
creature -> SaveToDB ();
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_WAYPOINT_ADDED );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetAllowMovementCommand ( ChatHandler * handler , char const * /*args*/ )
2010-11-19 14:04:21 +01:00
{
2010-12-23 23:25:44 +01:00
if ( sWorld -> getAllowMovement ())
2010-11-19 14:04:21 +01:00
{
2010-12-23 23:25:44 +01:00
sWorld -> SetAllowMovement ( false );
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_CREATURE_MOVE_DISABLED );
}
else
{
2010-12-23 23:25:44 +01:00
sWorld -> SetAllowMovement ( true );
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_CREATURE_MOVE_ENABLED );
}
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetEntryCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 newEntryNum = atoi ( args );
if ( ! newEntryNum )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
Unit * unit = handler -> getSelectedUnit ();
if ( ! unit || unit -> GetTypeId () != TYPEID_UNIT )
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
Creature * creature = unit -> ToCreature ();
if ( creature -> UpdateEntry ( newEntryNum ))
handler -> SendSysMessage ( LANG_DONE );
else
handler -> SendSysMessage ( LANG_ERROR );
return true ;
}
//change level of creature or pet
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetLevelCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint8 lvl = ( uint8 ) atoi (( char * ) args );
2010-12-23 23:25:44 +01:00
if ( lvl < 1 || lvl > sWorld -> getIntConfig ( CONFIG_MAX_PLAYER_LEVEL ) + 3 )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_BAD_VALUE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
if ( ! creature )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2013-06-11 18:39:51 -02:30
if ( creature -> IsPet ())
2010-11-19 14:04:21 +01:00
{
2011-07-02 22:18:03 +02:00
if ((( Pet * ) creature ) -> getPetType () == HUNTER_PET )
2010-11-09 10:15:35 -05:00
{
2011-07-02 22:18:03 +02:00
creature -> SetUInt32Value ( UNIT_FIELD_PETNEXTLEVELEXP , sObjectMgr -> GetXPForLevel ( lvl ) / 4 );
creature -> SetUInt32Value ( UNIT_FIELD_PETEXPERIENCE , 0 );
2010-11-09 10:15:35 -05:00
}
2011-07-02 22:18:03 +02:00
(( Pet * ) creature ) -> GivePetLevel ( lvl );
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
else
2010-11-09 10:15:35 -05:00
{
2011-07-02 22:18:03 +02:00
creature -> SetMaxHealth ( 100 + 30 * lvl );
creature -> SetHealth ( 100 + 30 * lvl );
creature -> SetLevel ( lvl );
creature -> SaveToDB ();
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcDeleteCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
Creature * unit = NULL ;
if ( * args )
{
// number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r
2011-04-29 20:47:02 +02:00
char * cId = handler -> extractKeyFromLink (( char * ) args , "Hcreature" );
2010-11-19 14:04:21 +01:00
if ( ! cId )
2010-11-09 10:15:35 -05:00
return false ;
2010-11-19 14:04:21 +01:00
uint32 lowguid = atoi ( cId );
if ( ! lowguid )
return false ;
2010-11-09 10:15:35 -05:00
2010-12-22 21:25:23 +01:00
if ( CreatureData const * cr_data = sObjectMgr -> GetCreatureData ( lowguid ))
2010-11-19 14:04:21 +01:00
unit = handler -> GetSession () -> GetPlayer () -> GetMap () -> GetCreature ( MAKE_NEW_GUID ( lowguid , cr_data -> id , HIGHGUID_UNIT ));
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
else
unit = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2013-06-11 19:54:27 -02:30
if ( ! unit || unit -> IsPet () || unit -> IsTotem ())
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// Delete the creature
unit -> CombatStop ();
unit -> DeleteFromDB ();
unit -> AddObjectToRemoveList ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_COMMAND_DELCREATMESSAGE );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//del item from vendor list
2012-10-24 13:29:34 +02:00
static bool HandleNpcDeleteVendorItemCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
Creature * vendor = handler -> getSelectedCreature ();
2013-06-11 19:54:27 -02:30
if ( ! vendor || ! vendor -> IsVendor ())
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_COMMAND_VENDORSELECTION );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2012-03-14 18:51:51 +01:00
char * pitem = handler -> extractKeyFromLink (( char * ) args , "Hitem" );
if ( ! pitem )
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_COMMAND_NEEDITEMSEND );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2012-03-14 18:51:51 +01:00
uint32 itemId = atol ( pitem );
2010-11-09 10:15:35 -05:00
2012-08-14 18:11:06 +01:00
const uint8 type = 1 ; // FIXME: make type (1 item, 2 currency) an argument
if ( ! sObjectMgr -> RemoveVendorItem ( vendor -> GetEntry (), itemId , type ))
2010-11-09 10:15:35 -05:00
{
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_ITEM_NOT_IN_LIST , itemId );
2010-11-19 14:04:21 +01:00
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2011-04-28 22:42:33 +02:00
ItemTemplate const * itemTemplate = sObjectMgr -> GetItemTemplate ( itemId );
2010-11-09 10:15:35 -05:00
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_ITEM_DELETED_FROM_LIST , itemId , itemTemplate -> Name1 . c_str ());
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//set faction of creature
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetFactionIdCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 factionId = ( uint32 ) atoi (( char * ) args );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( ! sFactionTemplateStore . LookupEntry ( factionId ))
{
handler -> PSendSysMessage ( LANG_WRONG_FACTION , factionId );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( ! creature )
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature -> setFaction ( factionId );
2010-11-09 10:15:35 -05:00
2011-12-31 00:32:05 +01:00
// Faction is set in creature_template - not inside creature
2010-11-09 10:15:35 -05:00
2011-12-31 00:32:05 +01:00
// Update in memory..
2012-02-27 14:58:47 +01:00
if ( CreatureTemplate const * cinfo = creature -> GetCreatureTemplate ())
2010-11-19 14:04:21 +01:00
{
2011-04-28 22:57:08 +02:00
const_cast < CreatureTemplate *> ( cinfo ) -> faction_A = factionId ;
const_cast < CreatureTemplate *> ( cinfo ) -> faction_H = factionId ;
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2011-12-31 00:32:05 +01:00
// ..and DB
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_UPD_CREATURE_FACTION );
stmt -> setUInt16 ( 0 , uint16 ( factionId ));
stmt -> setUInt16 ( 1 , uint16 ( factionId ));
stmt -> setUInt32 ( 2 , creature -> GetEntry ());
WorldDatabase . Execute ( stmt );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//set npcflag of creature
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetFlagCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 npcFlags = ( uint32 ) atoi (( char * ) args );
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( ! creature )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature -> SetUInt32Value ( UNIT_NPC_FLAGS , npcFlags );
2010-11-09 10:15:35 -05:00
2011-12-31 19:06:24 +01:00
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_UPD_CREATURE_NPCFLAG );
stmt -> setUInt32 ( 0 , npcFlags );
stmt -> setUInt32 ( 1 , creature -> GetEntry ());
WorldDatabase . Execute ( stmt );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_VALUE_SAVED_REJOIN );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-05-09 10:07:18 -04:00
//set data of creature for testing scripting
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetDataCommand ( ChatHandler * handler , char const * args )
2012-05-09 10:07:18 -04:00
{
if ( !* args )
return false ;
char * arg1 = strtok (( char * ) args , " " );
char * arg2 = strtok (( char * ) NULL , "" );
if ( ! arg1 || ! arg2 )
return false ;
uint32 data_1 = ( uint32 ) atoi ( arg1 );
uint32 data_2 = ( uint32 ) atoi ( arg2 );
if ( ! data_1 || ! data_2 )
return false ;
Creature * creature = handler -> getSelectedCreature ();
if ( ! creature )
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
creature -> AI () -> SetData ( data_1 , data_2 );
std :: string AIorScript = creature -> GetAIName () != "" ? "AI type: " + creature -> GetAIName () : ( creature -> GetScriptName () != "" ? "Script Name: " + creature -> GetScriptName () : "No AI or Script Name Set" );
2012-10-24 13:29:34 +02:00
handler -> PSendSysMessage ( LANG_NPC_SETDATA , creature -> GetGUID (), creature -> GetEntry (), creature -> GetName (). c_str (), data_1 , data_2 , AIorScript . c_str ());
2012-05-09 10:07:18 -04:00
return true ;
}
2010-11-19 14:04:21 +01:00
//npc follow handling
2012-10-24 13:29:34 +02:00
static bool HandleNpcFollowCommand ( ChatHandler * handler , char const * /*args*/ )
2010-11-19 14:04:21 +01:00
{
2011-06-12 01:47:45 +02:00
Player * player = handler -> GetSession () -> GetPlayer ();
2011-06-30 14:24:56 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( ! creature )
{
handler -> PSendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
// Follow player - Using pet's default dist and angle
creature -> GetMotionMaster () -> MoveFollow ( player , PET_FOLLOW_DIST , creature -> GetFollowAngle ());
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
handler -> PSendSysMessage ( LANG_CREATURE_FOLLOW_YOU_NOW , creature -> GetName (). c_str ());
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcInfoCommand ( ChatHandler * handler , char const * /*args*/ )
2010-11-19 14:04:21 +01:00
{
Creature * target = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( ! target )
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
uint32 faction = target -> getFaction ();
uint32 npcflags = target -> GetUInt32Value ( UNIT_NPC_FLAGS );
uint32 displayid = target -> GetDisplayId ();
uint32 nativeid = target -> GetNativeDisplayId ();
uint32 Entry = target -> GetEntry ();
2012-02-27 14:58:47 +01:00
CreatureTemplate const * cInfo = target -> GetCreatureTemplate ();
2010-11-19 14:04:21 +01:00
int64 curRespawnDelay = target -> GetRespawnTimeEx () - time ( NULL );
if ( curRespawnDelay < 0 )
curRespawnDelay = 0 ;
2011-04-29 20:47:02 +02:00
std :: string curRespawnDelayStr = secsToTimeString ( uint64 ( curRespawnDelay ), true );
std :: string defRespawnDelayStr = secsToTimeString ( target -> GetRespawnDelay (), true );
2010-11-19 14:04:21 +01:00
2011-03-11 23:31:06 +02:00
handler -> PSendSysMessage ( LANG_NPCINFO_CHAR , target -> GetDBTableGUIDLow (), target -> GetGUIDLow (), faction , npcflags , Entry , displayid , nativeid );
2010-11-19 14:04:21 +01:00
handler -> PSendSysMessage ( LANG_NPCINFO_LEVEL , target -> getLevel ());
2013-02-18 12:24:18 +00:00
handler -> PSendSysMessage ( LANG_NPCINFO_EQUIPMENT , target -> GetCurrentEquipmentId (), target -> GetOriginalEquipmentId ());
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_NPCINFO_HEALTH , target -> GetCreateHealth (), target -> GetMaxHealth (), target -> GetHealth ());
2013-03-09 22:34:46 +01:00
handler -> PSendSysMessage ( LANG_NPCINFO_FLAGS , target -> GetUInt32Value ( UNIT_FIELD_FLAGS ), target -> GetUInt32Value ( UNIT_FIELD_FLAGS_2 ), target -> GetUInt32Value ( UNIT_DYNAMIC_FLAGS ), target -> getFaction ());
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_COMMAND_RAWPAWNTIMES , defRespawnDelayStr . c_str (), curRespawnDelayStr . c_str ());
handler -> PSendSysMessage ( LANG_NPCINFO_LOOT , cInfo -> lootid , cInfo -> pickpocketLootId , cInfo -> SkinLootId );
2010-11-19 14:04:21 +01:00
handler -> PSendSysMessage ( LANG_NPCINFO_DUNGEON_ID , target -> GetInstanceId ());
handler -> PSendSysMessage ( LANG_NPCINFO_PHASEMASK , target -> GetPhaseMask ());
handler -> PSendSysMessage ( LANG_NPCINFO_ARMOR , target -> GetArmor ());
2013-02-19 01:16:24 +00:00
handler -> PSendSysMessage ( LANG_NPCINFO_POSITION , target -> GetPositionX (), target -> GetPositionY (), target -> GetPositionZ ());
2011-12-18 22:45:23 +01:00
handler -> PSendSysMessage ( LANG_NPCINFO_AIINFO , target -> GetAIName (). c_str (), target -> GetScriptName (). c_str ());
2010-11-19 14:04:21 +01:00
2013-01-19 19:17:31 +01:00
for ( uint8 i = 0 ; i < NPCFLAG_COUNT ; i ++ )
if ( npcflags & npcFlagTexts [ i ]. flag )
handler -> PSendSysMessage ( npcFlagTexts [ i ]. text , npcFlagTexts [ i ]. flag );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-12-30 17:09:55 +01:00
static bool HandleNpcNearCommand ( ChatHandler * handler , char const * args )
{
float distance = ( !* args ) ? 10.0f : float (( atof ( args )));
uint32 count = 0 ;
Player * player = handler -> GetSession () -> GetPlayer ();
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_SEL_CREATURE_NEAREST );
stmt -> setFloat ( 0 , player -> GetPositionX ());
stmt -> setFloat ( 1 , player -> GetPositionY ());
stmt -> setFloat ( 2 , player -> GetPositionZ ());
stmt -> setUInt32 ( 3 , player -> GetMapId ());
stmt -> setFloat ( 4 , player -> GetPositionX ());
stmt -> setFloat ( 5 , player -> GetPositionY ());
stmt -> setFloat ( 6 , player -> GetPositionZ ());
stmt -> setFloat ( 7 , distance * distance );
PreparedQueryResult result = WorldDatabase . Query ( stmt );
if ( result )
{
do
{
Field * fields = result -> Fetch ();
uint32 guid = fields [ 0 ]. GetUInt32 ();
uint32 entry = fields [ 1 ]. GetUInt32 ();
float x = fields [ 2 ]. GetFloat ();
float y = fields [ 3 ]. GetFloat ();
float z = fields [ 4 ]. GetFloat ();
uint16 mapId = fields [ 5 ]. GetUInt16 ();
CreatureTemplate const * creatureTemplate = sObjectMgr -> GetCreatureTemplate ( entry );
if ( ! creatureTemplate )
continue ;
handler -> PSendSysMessage ( LANG_CREATURE_LIST_CHAT , guid , guid , creatureTemplate -> Name . c_str (), x , y , z , mapId );
++ count ;
}
while ( result -> NextRow ());
}
handler -> PSendSysMessage ( LANG_COMMAND_NEAR_NPC_MESSAGE , distance , count );
return true ;
}
2010-11-19 14:04:21 +01:00
//move selected creature
2012-10-24 13:29:34 +02:00
static bool HandleNpcMoveCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
uint32 lowguid = 0 ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( ! creature )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
// number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r
2011-04-29 20:47:02 +02:00
char * cId = handler -> extractKeyFromLink (( char * ) args , "Hcreature" );
2010-11-19 14:04:21 +01:00
if ( ! cId )
return false ;
lowguid = atoi ( cId );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
/* FIXME: impossible without entry
if (lowguid)
2011-07-02 22:18:03 +02:00
creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), MAKE_GUID(lowguid, HIGHGUID_UNIT));
2010-11-19 14:04:21 +01:00
*/
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// Attempting creature load from DB data
2011-07-02 22:18:03 +02:00
if ( ! creature )
2010-11-09 10:15:35 -05:00
{
2010-12-22 21:25:23 +01:00
CreatureData const * data = sObjectMgr -> GetCreatureData ( lowguid );
2010-11-19 14:04:21 +01:00
if ( ! data )
{
handler -> PSendSysMessage ( LANG_COMMAND_CREATGUIDNOTFOUND , lowguid );
handler -> SetSentErrorMessage ( true );
2010-11-09 10:15:35 -05:00
return false ;
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 map_id = data -> mapid ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( handler -> GetSession () -> GetPlayer () -> GetMapId () != map_id )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> PSendSysMessage ( LANG_COMMAND_CREATUREATSAMEMAP , lowguid );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
}
else
{
2011-07-02 22:18:03 +02:00
lowguid = creature -> GetDBTableGUIDLow ();
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
}
else
{
2011-07-02 22:18:03 +02:00
lowguid = creature -> GetDBTableGUIDLow ();
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
float x = handler -> GetSession () -> GetPlayer () -> GetPositionX ();
float y = handler -> GetSession () -> GetPlayer () -> GetPositionY ();
float z = handler -> GetSession () -> GetPlayer () -> GetPositionZ ();
float o = handler -> GetSession () -> GetPlayer () -> GetOrientation ();
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( creature )
2010-11-19 14:04:21 +01:00
{
2011-07-02 22:18:03 +02:00
if ( CreatureData const * data = sObjectMgr -> GetCreatureData ( creature -> GetDBTableGUIDLow ()))
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
const_cast < CreatureData *> ( data ) -> posX = x ;
const_cast < CreatureData *> ( data ) -> posY = y ;
const_cast < CreatureData *> ( data ) -> posZ = z ;
const_cast < CreatureData *> ( data ) -> orientation = o ;
2010-11-09 10:15:35 -05:00
}
2011-10-10 17:08:01 -04:00
creature -> SetPosition ( x , y , z , o );
2011-07-02 22:18:03 +02:00
creature -> GetMotionMaster () -> Initialize ();
2013-06-11 19:54:27 -02:30
if ( creature -> IsAlive ()) // dead creature will reset movement generator at respawn
2010-11-09 10:15:35 -05:00
{
2011-07-02 22:18:03 +02:00
creature -> setDeathState ( JUST_DIED );
creature -> Respawn ();
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2011-12-31 19:06:24 +01:00
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_UPD_CREATURE_POSITION );
stmt -> setFloat ( 0 , x );
stmt -> setFloat ( 1 , y );
stmt -> setFloat ( 2 , z );
stmt -> setFloat ( 3 , o );
stmt -> setUInt32 ( 4 , lowguid );
WorldDatabase . Execute ( stmt );
2010-11-19 14:04:21 +01:00
handler -> PSendSysMessage ( LANG_COMMAND_CREATUREMOVED );
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//play npc emote
2012-10-24 13:29:34 +02:00
static bool HandleNpcPlayEmoteCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
uint32 emote = atoi (( char * ) args );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
Creature * target = handler -> getSelectedCreature ();
if ( ! target )
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2012-03-19 16:48:08 +01:00
if ( target -> GetTransport () && target -> GetGUIDTransport ())
{
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_UPD_CREATURE_TRANSPORT_EMOTE );
2012-03-27 00:43:56 +01:00
stmt -> setInt32 ( 0 , int32 ( emote ));
2012-03-19 16:48:08 +01:00
stmt -> setInt32 ( 1 , target -> GetTransport () -> GetEntry ());
stmt -> setInt32 ( 2 , target -> GetGUIDTransport ());
WorldDatabase . Execute ( stmt );
}
2010-11-09 10:15:35 -05:00
2011-04-29 20:47:02 +02:00
target -> SetUInt32Value ( UNIT_NPC_EMOTESTATE , emote );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//set model of creature
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetModelCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 displayId = ( uint32 ) atoi (( char * ) args );
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2013-06-11 18:39:51 -02:30
if ( ! creature || creature -> IsPet ())
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2011-07-02 22:18:03 +02:00
creature -> SetDisplayId ( displayId );
creature -> SetNativeDisplayId ( displayId );
2010-11-19 14:04:21 +01:00
2011-07-02 22:18:03 +02:00
creature -> SaveToDB ();
2010-11-19 14:04:21 +01:00
return true ;
}
/**HandleNpcSetMoveTypeCommand
* Set the movement type for an NPC.<br/>
* <br/>
* Valid movement types are:
* <ul>
* <li> stay - NPC wont move </li>
* <li> random - NPC will move randomly according to the spawndist </li>
* <li> way - NPC will move with given waypoints set </li>
* </ul>
* additional parameter: NODEL - so no waypoints are deleted, if you
* change the movement type
*/
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetMoveTypeCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// 3 arguments:
// GUID (optional - you can also select the creature)
// stay|random|way (determines the kind of movement)
// NODEL (optional - tells the system NOT to delete any waypoints)
// this is very handy if you want to do waypoints, that are
// later switched on/off according to special events (like escort
// quests, etc)
char * guid_str = strtok (( char * ) args , " " );
char * type_str = strtok (( char * ) NULL , " " );
char * dontdel_str = strtok (( char * ) NULL , " " );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
bool doNotDelete = false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( ! guid_str )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 lowguid = 0 ;
2011-07-02 22:18:03 +02:00
Creature * creature = NULL ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( dontdel_str )
{
2013-05-13 15:07:36 +02:00
//TC_LOG_ERROR(LOG_FILTER_GENERAL, "DEBUG: All 3 params are set");
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// All 3 params are set
// GUID
// type
// doNotDEL
if ( stricmp ( dontdel_str , "NODEL" ) == 0 )
2010-11-09 10:15:35 -05:00
{
2013-05-13 15:07:36 +02:00
//TC_LOG_ERROR(LOG_FILTER_GENERAL, "DEBUG: doNotDelete = true;");
2010-11-19 14:04:21 +01:00
doNotDelete = true ;
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
}
else
{
// Only 2 params - but maybe NODEL is set
if ( type_str )
2010-11-09 10:15:35 -05:00
{
2013-05-13 15:07:36 +02:00
TC_LOG_ERROR ( LOG_FILTER_GENERAL , "DEBUG: Only 2 params " );
2010-11-19 14:04:21 +01:00
if ( stricmp ( type_str , "NODEL" ) == 0 )
2010-11-09 10:15:35 -05:00
{
2013-05-13 15:07:36 +02:00
//TC_LOG_ERROR(LOG_FILTER_GENERAL, "DEBUG: type_str, NODEL ");
2010-11-19 14:04:21 +01:00
doNotDelete = true ;
type_str = NULL ;
2010-11-09 10:15:35 -05:00
}
}
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( ! type_str ) // case .setmovetype $move_type (with selected creature)
{
type_str = guid_str ;
2011-07-02 22:18:03 +02:00
creature = handler -> getSelectedCreature ();
2013-06-11 18:39:51 -02:30
if ( ! creature || creature -> IsPet ())
2010-11-09 10:15:35 -05:00
return false ;
2011-07-02 22:18:03 +02:00
lowguid = creature -> GetDBTableGUIDLow ();
2010-11-19 14:04:21 +01:00
}
else // case .setmovetype #creature_guid $move_type (with selected creature)
{
lowguid = atoi (( char * ) guid_str );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
/* impossible without entry
if (lowguid)
2011-07-02 22:18:03 +02:00
creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), MAKE_GUID(lowguid, HIGHGUID_UNIT));
2010-11-19 14:04:21 +01:00
*/
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// attempt check creature existence by DB data
2011-07-02 22:18:03 +02:00
if ( ! creature )
2010-11-09 10:15:35 -05:00
{
2010-12-22 21:25:23 +01:00
CreatureData const * data = sObjectMgr -> GetCreatureData ( lowguid );
2010-11-19 14:04:21 +01:00
if ( ! data )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> PSendSysMessage ( LANG_COMMAND_CREATGUIDNOTFOUND , lowguid );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
}
else
{
2011-07-02 22:18:03 +02:00
lowguid = creature -> GetDBTableGUIDLow ();
2010-11-09 10:15:35 -05:00
}
}
2010-11-19 14:04:21 +01:00
// now lowguid is low guid really existed creature
2011-07-02 22:18:03 +02:00
// and creature point (maybe) to this creature or NULL
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
MovementGeneratorType move_type ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
std :: string type = type_str ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( type == "stay" )
move_type = IDLE_MOTION_TYPE ;
else if ( type == "random" )
move_type = RANDOM_MOTION_TYPE ;
else if ( type == "way" )
move_type = WAYPOINT_MOTION_TYPE ;
else
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// update movement type
//if (doNotDelete == false)
// WaypointMgr.DeletePath(lowguid);
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( creature )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
// update movement type
if ( doNotDelete == false )
2011-07-02 22:18:03 +02:00
creature -> LoadPath ( 0 );
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature -> SetDefaultMovementType ( move_type );
creature -> GetMotionMaster () -> Initialize ();
2013-06-11 19:54:27 -02:30
if ( creature -> IsAlive ()) // dead creature will reset movement generator at respawn
2010-11-09 10:15:35 -05:00
{
2011-07-02 22:18:03 +02:00
creature -> setDeathState ( JUST_DIED );
creature -> Respawn ();
2010-11-09 10:15:35 -05:00
}
2011-07-02 22:18:03 +02:00
creature -> SaveToDB ();
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
if ( doNotDelete == false )
2010-11-09 10:15:35 -05:00
{
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_MOVE_TYPE_SET , type_str );
2010-11-19 14:04:21 +01:00
}
else
{
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_MOVE_TYPE_SET_NODEL , type_str );
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//npc phasemask handling
//change phasemask of creature or pet
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetPhaseCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 phasemask = ( uint32 ) atoi (( char * ) args );
if ( phasemask == 0 )
{
handler -> SendSysMessage ( LANG_BAD_VALUE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
if ( ! creature )
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature -> SetPhaseMask ( phasemask , true );
2010-11-09 10:15:35 -05:00
2013-06-11 18:39:51 -02:30
if ( ! creature -> IsPet ())
2011-07-02 22:18:03 +02:00
creature -> SaveToDB ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//set spawn dist of creature
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetSpawnDistCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
float option = ( float )( atof (( char * ) args ));
if ( option < 0.0f )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_BAD_VALUE );
return false ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
MovementGeneratorType mtype = IDLE_MOTION_TYPE ;
if ( option > 0.0f )
mtype = RANDOM_MOTION_TYPE ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2011-12-31 19:06:24 +01:00
uint32 guidLow = 0 ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( creature )
2011-12-31 19:06:24 +01:00
guidLow = creature -> GetDBTableGUIDLow ();
2010-11-19 14:04:21 +01:00
else
return false ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature -> SetRespawnRadius (( float ) option );
creature -> SetDefaultMovementType ( mtype );
creature -> GetMotionMaster () -> Initialize ();
2013-06-11 19:54:27 -02:30
if ( creature -> IsAlive ()) // dead creature will reset movement generator at respawn
2010-11-19 14:04:21 +01:00
{
2011-07-02 22:18:03 +02:00
creature -> setDeathState ( JUST_DIED );
creature -> Respawn ();
2010-11-09 10:15:35 -05:00
}
2011-12-31 19:06:24 +01:00
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_UPD_CREATURE_SPAWN_DISTANCE );
stmt -> setFloat ( 0 , option );
stmt -> setUInt8 ( 1 , uint8 ( mtype ));
stmt -> setUInt32 ( 2 , guidLow );
WorldDatabase . Execute ( stmt );
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_COMMAND_SPAWNDIST , option );
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//spawn time handling
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetSpawnTimeCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
char * stime = strtok (( char * ) args , " " );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( ! stime )
return false ;
2010-11-09 10:15:35 -05:00
2011-12-31 19:06:24 +01:00
int spawnTime = atoi (( char * ) stime );
2010-11-09 10:15:35 -05:00
2011-12-31 19:06:24 +01:00
if ( spawnTime < 0 )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> SendSysMessage ( LANG_BAD_VALUE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2011-12-31 19:06:24 +01:00
uint32 guidLow = 0 ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( creature )
2011-12-31 19:06:24 +01:00
guidLow = creature -> GetDBTableGUIDLow ();
2010-11-19 14:04:21 +01:00
else
return false ;
2010-11-09 10:15:35 -05:00
2011-12-31 19:06:24 +01:00
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_UPD_CREATURE_SPAWN_TIME_SECS );
stmt -> setUInt32 ( 0 , uint32 ( spawnTime ));
stmt -> setUInt32 ( 1 , guidLow );
WorldDatabase . Execute ( stmt );
creature -> SetRespawnDelay (( uint32 ) spawnTime );
handler -> PSendSysMessage ( LANG_COMMAND_SPAWNTIME , spawnTime );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcSayCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
if ( ! creature )
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2011-07-02 22:18:03 +02:00
creature -> MonsterSay ( args , LANG_UNIVERSAL , 0 );
2010-11-19 14:04:21 +01:00
// make some emotes
char lastchar = args [ strlen ( args ) - 1 ];
2011-09-29 12:43:05 +02:00
switch ( lastchar )
2010-11-09 10:15:35 -05:00
{
2011-07-02 22:18:03 +02:00
case '?' : creature -> HandleEmoteCommand ( EMOTE_ONESHOT_QUESTION ); break ;
case '!' : creature -> HandleEmoteCommand ( EMOTE_ONESHOT_EXCLAMATION ); break ;
default : creature -> HandleEmoteCommand ( EMOTE_ONESHOT_TALK ); break ;
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//show text emote by creature in chat
2012-10-24 13:29:34 +02:00
static bool HandleNpcTextEmoteCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( ! creature )
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature -> MonsterTextEmote ( args , 0 );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//npc unfollow handling
2012-10-24 13:29:34 +02:00
static bool HandleNpcUnFollowCommand ( ChatHandler * handler , char const * /*args*/ )
2010-11-19 14:04:21 +01:00
{
2011-06-12 01:47:45 +02:00
Player * player = handler -> GetSession () -> GetPlayer ();
2011-06-30 14:24:56 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( ! creature )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> PSendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( /*creature->GetMotionMaster()->empty() ||*/
2012-03-16 19:40:57 +08:00
creature -> GetMotionMaster () -> GetCurrentMovementGeneratorType () != FOLLOW_MOTION_TYPE )
2010-11-19 14:04:21 +01:00
{
2012-10-24 13:29:34 +02:00
handler -> PSendSysMessage ( LANG_CREATURE_NOT_FOLLOW_YOU , creature -> GetName (). c_str ());
2010-11-19 14:04:21 +01:00
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2012-01-14 15:34:41 +01:00
FollowMovementGenerator < Creature > const * mgen = static_cast < FollowMovementGenerator < Creature > const *> (( creature -> GetMotionMaster () -> top ()));
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( mgen -> GetTarget () != player )
{
2012-10-24 13:29:34 +02:00
handler -> PSendSysMessage ( LANG_CREATURE_NOT_FOLLOW_YOU , creature -> GetName (). c_str ());
2010-11-19 14:04:21 +01:00
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
// reset movement
creature -> GetMotionMaster () -> MovementExpired ( true );
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
handler -> PSendSysMessage ( LANG_CREATURE_NOT_FOLLOW_YOU_NOW , creature -> GetName (). c_str ());
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// make npc whisper to player
2012-10-24 13:29:34 +02:00
static bool HandleNpcWhisperCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
char * receiver_str = strtok (( char * ) args , " " );
char * text = strtok ( NULL , "" );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint64 guid = handler -> GetSession () -> GetPlayer () -> GetSelection ();
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> GetSession () -> GetPlayer () -> GetMap () -> GetCreature ( guid );
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( ! creature || ! receiver_str || ! text )
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
return false ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint64 receiver_guid = atol ( receiver_str );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// check online security
2011-07-27 12:14:27 +02:00
if ( handler -> HasLowerSecurity ( ObjectAccessor :: FindPlayer ( receiver_guid ), 0 ))
2010-11-19 14:04:21 +01:00
return false ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature -> MonsterWhisper ( text , receiver_guid );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcYellCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
if ( ! creature )
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature -> MonsterYell ( args , LANG_UNIVERSAL , 0 );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// make an emote
2011-07-02 22:18:03 +02:00
creature -> HandleEmoteCommand ( EMOTE_ONESHOT_SHOUT );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// add creature, temp only
2012-10-24 13:29:34 +02:00
static bool HandleNpcAddTempSpawnCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
char * charID = strtok (( char * ) args , " " );
if ( ! charID )
return false ;
2010-11-09 10:15:35 -05:00
2011-06-30 14:24:56 +02:00
Player * chr = handler -> GetSession () -> GetPlayer ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 id = atoi ( charID );
if ( ! id )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
chr -> SummonCreature ( id , * chr , TEMPSUMMON_CORPSE_DESPAWN , 120 );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
//npc tame handling
2012-10-24 13:29:34 +02:00
static bool HandleNpcTameCommand ( ChatHandler * handler , char const * /*args*/ )
2010-11-19 14:04:21 +01:00
{
2012-03-16 19:40:57 +08:00
Creature * creatureTarget = handler -> getSelectedCreature ();
2013-06-11 18:39:51 -02:30
if ( ! creatureTarget || creatureTarget -> IsPet ())
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler -> PSendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2012-03-16 19:40:57 +08:00
Player * player = handler -> GetSession () -> GetPlayer ();
2010-11-09 10:15:35 -05:00
2012-03-16 19:40:57 +08:00
if ( player -> GetPetGUID ())
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_YOU_ALREADY_HAVE_PET );
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2012-02-27 14:58:47 +01:00
CreatureTemplate const * cInfo = creatureTarget -> GetCreatureTemplate ();
2010-11-09 10:15:35 -05:00
2013-06-11 21:25:12 -02:30
if ( ! cInfo -> IsTameable ( player -> CanTameExoticPets ()))
2010-11-19 14:04:21 +01:00
{
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_CREATURE_NON_TAMEABLE , cInfo -> Entry );
2010-11-19 14:04:21 +01:00
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
// Everything looks OK, create new pet
2011-11-28 14:34:30 -05:00
Pet * pet = player -> CreateTamedPetFrom ( creatureTarget );
2010-11-19 14:04:21 +01:00
if ( ! pet )
2010-11-09 10:15:35 -05:00
{
2011-04-29 20:47:02 +02:00
handler -> PSendSysMessage ( LANG_CREATURE_NON_TAMEABLE , cInfo -> Entry );
2010-11-19 14:04:21 +01:00
handler -> SetSentErrorMessage ( true );
return false ;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// place pet before player
2011-04-29 20:47:02 +02:00
float x , y , z ;
2012-03-16 19:40:57 +08:00
player -> GetClosePoint ( x , y , z , creatureTarget -> GetObjectSize (), CONTACT_DISTANCE );
pet -> Relocate ( x , y , z , M_PI - player -> GetOrientation ());
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// set pet to defensive mode by default (some classes can't control controlled pets in fact).
pet -> SetReactState ( REACT_DEFENSIVE );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// calculate proper level
uint8 level = ( creatureTarget -> getLevel () < ( player -> getLevel () - 5 )) ? ( player -> getLevel () - 5 ) : creatureTarget -> getLevel ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// prepare visual effect for levelup
pet -> SetUInt32Value ( UNIT_FIELD_LEVEL , level - 1 );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// add to world
2011-10-10 17:39:34 -04:00
pet -> GetMap () -> AddToMap ( pet -> ToCreature ());
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// visual effect for levelup
pet -> SetUInt32Value ( UNIT_FIELD_LEVEL , level );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
// caster have pet now
player -> SetMinion ( pet , true );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
pet -> SavePetToDB ( PET_SAVE_AS_CURRENT );
player -> PetSpellInitialize ();
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcAddFormationCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 leaderGUID = ( uint32 ) atoi (( char * ) args );
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if ( ! creature || ! creature -> GetDBTableGUIDLow ())
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
2010-11-09 10:15:35 -05:00
}
2011-07-02 22:18:03 +02:00
uint32 lowguid = creature -> GetDBTableGUIDLow ();
if ( creature -> GetFormation ())
2010-11-09 10:15:35 -05:00
{
2011-07-02 22:18:03 +02:00
handler -> PSendSysMessage ( "Selected creature is already member of group %u" , creature -> GetFormation () -> GetId ());
2010-11-09 10:15:35 -05:00
return false ;
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if ( ! lowguid )
return false ;
2010-11-09 10:15:35 -05:00
2011-06-30 14:24:56 +02:00
Player * chr = handler -> GetSession () -> GetPlayer ();
2011-09-15 14:08:17 +02:00
FormationInfo * group_member ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
group_member = new FormationInfo ;
2011-07-02 22:18:03 +02:00
group_member -> follow_angle = ( creature -> GetAngle ( chr ) - chr -> GetOrientation ()) * 180 / M_PI ;
group_member -> follow_dist = sqrtf ( pow ( chr -> GetPositionX () - creature -> GetPositionX (), int ( 2 )) + pow ( chr -> GetPositionY () - creature -> GetPositionY (), int ( 2 )));
2010-11-19 14:04:21 +01:00
group_member -> leaderGUID = leaderGUID ;
group_member -> groupAI = 0 ;
2010-11-09 10:15:35 -05:00
2012-03-25 09:25:28 -05:00
sFormationMgr -> CreatureGroupMap [ lowguid ] = group_member ;
2011-07-02 22:18:03 +02:00
creature -> SearchFormation ();
2010-11-09 10:15:35 -05:00
2011-12-31 19:06:24 +01:00
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_INS_CREATURE_FORMATION );
stmt -> setUInt32 ( 0 , leaderGUID );
stmt -> setUInt32 ( 1 , lowguid );
stmt -> setFloat ( 2 , group_member -> follow_dist );
stmt -> setFloat ( 3 , group_member -> follow_angle );
stmt -> setUInt32 ( 4 , uint32 ( group_member -> groupAI ));
WorldDatabase . Execute ( stmt );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
handler -> PSendSysMessage ( "Creature %u added to formation with leader %u" , lowguid , leaderGUID );
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetLinkCommand ( ChatHandler * handler , char const * args )
2010-11-19 14:04:21 +01:00
{
if ( !* args )
return false ;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 linkguid = ( uint32 ) atoi (( char * ) args );
2011-07-02 22:18:03 +02:00
Creature * creature = handler -> getSelectedCreature ();
2010-11-19 14:04:21 +01:00
2011-07-02 22:18:03 +02:00
if ( ! creature )
2010-11-19 14:04:21 +01:00
{
handler -> SendSysMessage ( LANG_SELECT_CREATURE );
handler -> SetSentErrorMessage ( true );
return false ;
}
2011-07-02 22:18:03 +02:00
if ( ! creature -> GetDBTableGUIDLow ())
2010-11-19 14:04:21 +01:00
{
2011-07-02 22:18:03 +02:00
handler -> PSendSysMessage ( "Selected creature %u isn't in creature table" , creature -> GetGUIDLow ());
2010-11-19 14:04:21 +01:00
handler -> SetSentErrorMessage ( true );
return false ;
}
2011-07-02 22:18:03 +02:00
if ( ! sObjectMgr -> SetCreatureLinkedRespawn ( creature -> GetDBTableGUIDLow (), linkguid ))
2010-11-19 14:04:21 +01:00
{
handler -> PSendSysMessage ( "Selected creature can't link with guid '%u'" , linkguid );
handler -> SetSentErrorMessage ( true );
return false ;
}
2011-07-02 22:18:03 +02:00
handler -> PSendSysMessage ( "LinkGUID '%u' added to creature with DBTableGUID: '%u'" , linkguid , creature -> GetDBTableGUIDLow ());
2010-11-19 14:04:21 +01:00
return true ;
}
2013-03-08 21:41:30 +01:00
/// @todo NpcCommands that need to be fixed :
2012-10-24 13:29:34 +02:00
static bool HandleNpcAddWeaponCommand ( ChatHandler * /*handler*/ , char const * /*args*/ )
2010-11-19 14:04:21 +01:00
{
/*if (!*args)
return false;
uint64 guid = handler->GetSession()->GetPlayer()->GetSelection();
if (guid == 0)
{
handler->SendSysMessage(LANG_NO_SELECTION);
2010-11-09 10:15:35 -05:00
return true;
}
2011-07-02 22:18:03 +02:00
Creature* creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), guid);
2010-11-19 14:04:21 +01:00
2011-07-02 22:18:03 +02:00
if (!creature)
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler->SendSysMessage(LANG_SELECT_CREATURE);
return true;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
char* pSlotID = strtok((char*)args, " ");
if (!pSlotID)
return false;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
char* pItemID = strtok(NULL, " ");
if (!pItemID)
return false;
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint32 ItemID = atoi(pItemID);
uint32 SlotID = atoi(pSlotID);
2010-11-09 10:15:35 -05:00
2011-04-29 16:48:15 +06:00
ItemTemplate* tmpItem = sObjectMgr->GetItemTemplate(ItemID);
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
bool added = false;
if (tmpItem)
{
2011-09-29 12:43:05 +02:00
switch (SlotID)
2010-11-19 14:04:21 +01:00
{
case 1:
2011-07-02 22:18:03 +02:00
creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, ItemID);
2010-11-19 14:04:21 +01:00
added = true;
break;
case 2:
2011-07-02 22:18:03 +02:00
creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY_01, ItemID);
2010-11-19 14:04:21 +01:00
added = true;
break;
case 3:
2011-07-02 22:18:03 +02:00
creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY_02, ItemID);
2010-11-19 14:04:21 +01:00
added = true;
break;
default:
2011-04-29 20:47:02 +02:00
handler->PSendSysMessage(LANG_ITEM_SLOT_NOT_EXIST, SlotID);
2010-11-19 14:04:21 +01:00
added = false;
break;
}
if (added)
2011-04-29 20:47:02 +02:00
handler->PSendSysMessage(LANG_ITEM_ADDED_TO_SLOT, ItemID, tmpItem->Name1, SlotID);
2010-11-19 14:04:21 +01:00
}
else
{
2011-04-29 20:47:02 +02:00
handler->PSendSysMessage(LANG_ITEM_NOT_FOUND, ItemID);
2010-11-19 14:04:21 +01:00
return true;
}
*/
return true ;
}
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetNameCommand ( ChatHandler * /*handler*/ , char const * /*args*/ )
2010-11-19 14:04:21 +01:00
{
/* Temp. disabled
if (!*args)
return false;
if (strlen((char*)args)>75)
{
handler->PSendSysMessage(LANG_TOO_LONG_NAME, strlen((char*)args)-75);
return true;
}
for (uint8 i = 0; i < strlen(args); ++i)
{
if (!isalpha(args[i]) && args[i] != ' ')
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler->SendSysMessage(LANG_CHARS_ONLY);
return false;
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
uint64 guid;
guid = handler->GetSession()->GetPlayer()->GetSelection();
if (guid == 0)
{
handler->SendSysMessage(LANG_NO_SELECTION);
return true;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature* creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), guid);
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if (!creature)
2010-11-19 14:04:21 +01:00
{
handler->SendSysMessage(LANG_SELECT_CREATURE);
2010-11-09 10:15:35 -05:00
return true;
}
2011-07-02 22:18:03 +02:00
creature->SetName(args);
uint32 idname = sObjectMgr->AddCreatureTemplate(creature->GetName());
creature->SetUInt32Value(OBJECT_FIELD_ENTRY, idname);
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
creature->SaveToDB();
2010-11-19 14:04:21 +01:00
*/
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
return true ;
}
2010-11-09 10:15:35 -05:00
2012-10-24 13:29:34 +02:00
static bool HandleNpcSetSubNameCommand ( ChatHandler * /*handler*/ , char const * /*args*/ )
2010-11-19 14:04:21 +01:00
{
/* Temp. disabled
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if (!*args)
args = "";
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
if (strlen((char*)args)>75)
{
handler->PSendSysMessage(LANG_TOO_LONG_SUBNAME, strlen((char*)args)-75);
return true;
}
2010-11-09 10:15:35 -05:00
2010-11-19 14:04:21 +01:00
for (uint8 i = 0; i < strlen(args); i++)
{
if (!isalpha(args[i]) && args[i] != ' ')
2010-11-09 10:15:35 -05:00
{
2010-11-19 14:04:21 +01:00
handler->SendSysMessage(LANG_CHARS_ONLY);
return false;
2010-11-09 10:15:35 -05:00
}
2010-11-19 14:04:21 +01:00
}
uint64 guid;
guid = handler->GetSession()->GetPlayer()->GetSelection();
if (guid == 0)
{
handler->SendSysMessage(LANG_NO_SELECTION);
return true;
}
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
Creature* creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), guid);
2010-11-09 10:15:35 -05:00
2011-07-02 22:18:03 +02:00
if (!creature)
2010-11-19 14:04:21 +01:00
{
handler->SendSysMessage(LANG_SELECT_CREATURE);
2010-11-09 10:15:35 -05:00
return true;
}
2010-11-19 14:04:21 +01:00
2011-07-02 22:18:03 +02:00
uint32 idname = sObjectMgr->AddCreatureSubName(creature->GetName(), args, creature->GetUInt32Value(UNIT_FIELD_DISPLAYID));
creature->SetUInt32Value(OBJECT_FIELD_ENTRY, idname);
2010-11-19 14:04:21 +01:00
2011-07-02 22:18:03 +02:00
creature->SaveToDB();
2010-11-19 14:04:21 +01:00
*/
return true ;
}
2010-11-09 10:15:35 -05:00
};
void AddSC_npc_commandscript ()
{
new npc_commandscript ();
}