Guest User

Arcemu Vehicle PowerUps v3 - Code by Nirual

a guest
Dec 24th, 2011
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. #include "Setup.h"
  2.  
  3. /*
  4.  *  VehiclePower-Ups v3 - Code by Nirual
  5.  *      http://tinyurl.com/cklfzag
  6.  */
  7.  
  8. struct VehiclePowerUp
  9. {
  10.     uint32 creature_entry;
  11.     uint32 vehicle_time;
  12.     uint32 respawn_time;
  13. };
  14.  
  15. std::map<uint32, VehiclePowerUp*> m_VehicleStorage;
  16.  
  17. class PowerUpVehicle : public CreatureAIScript
  18. {
  19. public:
  20.     ADD_CREATURE_FACTORY_FUNCTION(PowerUpVehicle);
  21.     PowerUpVehicle(Creature* pCreature) : CreatureAIScript(pCreature) {}
  22.  
  23.     void OnLastPassengerLeft( Unit *passenger )
  24.     {
  25.         _unit->Despawn(100, 0);
  26.     }
  27. };
  28.  
  29. class VehicleActivator : public GameObjectAIScript
  30. {
  31. public:
  32.     VehicleActivator(GameObject*  goinstance) : GameObjectAIScript(goinstance) {}
  33.     static GameObjectAIScript* Create(GameObject* GO) { return new VehicleActivator(GO); }
  34.  
  35.     void OnCreate()
  36.     {
  37.         VehiclePowerUp* power_up = m_VehicleStorage[_gameobject->GetEntry()];
  38.  
  39.         if(power_up == NULL)
  40.         {
  41.             sLog.Error("[VehiclePowerUp]", "Gameobject with entry %u should not have that script");
  42.             return;
  43.         }
  44.  
  45.         CreatureEntry = power_up->creature_entry;
  46.         vehicle_time = power_up->vehicle_time;
  47.         respawn_time = power_up->respawn_time;
  48.  
  49.  
  50.         RegisterAIUpdateEvent(100);
  51.     }
  52.  
  53.     void AIUpdate()
  54.     {
  55.         float d2 = 0;
  56.         float dist = 0;
  57.         Player* ret = NULL;
  58.  
  59.         for(set<Object*>::iterator itr = _gameobject->GetInRangePlayerSetBegin(); itr != _gameobject->GetInRangePlayerSetEnd(); ++itr)
  60.         {
  61.             d2 = (TO< Player* >(*itr))->GetDistanceSq(_gameobject);
  62.             if(!ret || d2 < dist)
  63.             {
  64.                 dist = d2;
  65.                 ret = TO< Player* >(*itr);
  66.             }
  67.         }
  68.  
  69.         if(ret == NULL)
  70.             return;
  71.  
  72.         if(ret->GetCurrentVehicle() != NULL)
  73.             return;
  74.  
  75.         if(_gameobject->GetDistance2dSq(ret) > 1.5)
  76.             return;
  77.  
  78.         _gameobject->Despawn(1, respawn_time);
  79.  
  80.  
  81.         Creature* pVehicle = ret->GetMapMgr()->CreateCreature(CreatureEntry);
  82.  
  83.         pVehicle->Load(CreatureProtoStorage.LookupEntry(CreatureEntry), ret->GetPositionX(), ret->GetPositionY(), ret->GetPositionZ(), ret->GetOrientation());
  84.         pVehicle->m_loadedFromDB = true;
  85.         pVehicle->SetFaction(ret->GetFaction());
  86.         pVehicle->Phase(PHASE_SET, ret->GetPhase());
  87.         pVehicle->m_noRespawn = true;
  88.         pVehicle->PushToWorld(_gameobject->GetMapMgr());
  89.        
  90.         ret->EnterVehicle(pVehicle->GetGUID(), 200);
  91.  
  92.         pVehicle->Despawn(vehicle_time, 0);
  93.        
  94.     }
  95.  
  96.    
  97. private:
  98.     uint32 CreatureEntry, respawn_time, vehicle_time;
  99.  
  100. };
  101.  
  102. void SetupPowerUps(ScriptMgr* mgr)
  103. {
  104.     QueryResult * query = WorldDatabase.Query("SELECT * FROM vehicle_powerup;");
  105.     if(query == NULL)
  106.         return;
  107.  
  108.     uint32 gameobject_entry, creature_entry;
  109.     uint32 i = 0;
  110.     do
  111.     {
  112.         gameobject_entry = query->Fetch()[0].GetUInt32();
  113.         creature_entry = query->Fetch()[1].GetUInt32();
  114.  
  115.         CreatureProto* pCreatureProto = CreatureProtoStorage.LookupEntry(creature_entry);
  116.         CreatureInfo* pCreatureInfo = CreatureNameStorage.LookupEntry(creature_entry);
  117.        
  118.         if(GameObjectNameStorage.LookupEntry(gameobject_entry) == NULL)
  119.             sLog.Error("[VehiclePowerUp]", "Gameobject with entry %u not found.", gameobject_entry );
  120.         else if(pCreatureProto == NULL || pCreatureInfo == NULL)
  121.             sLog.Error("[VehiclePowerUp]", "Creature with entry %u not found (gameobject id: %u).", creature_entry, gameobject_entry );
  122.         else if(pCreatureProto->vehicleid == 0)
  123.             sLog.Error("[VehiclePowerUp]", "Creature with entry %u is not a vehicle.", creature_entry );
  124.         else
  125.         {
  126.             VehiclePowerUp* power_up = new VehiclePowerUp;
  127.             power_up->creature_entry = creature_entry;
  128.             power_up->vehicle_time = query->Fetch()[2].GetUInt32();
  129.             power_up->respawn_time = query->Fetch()[3].GetUInt32();
  130.             m_VehicleStorage[gameobject_entry] = power_up;
  131.  
  132.  
  133.             mgr->register_creature_script(creature_entry, &PowerUpVehicle::Create);
  134.             mgr->register_gameobject_script(gameobject_entry, &VehicleActivator::Create);
  135.             i++;
  136.         }
  137.     } while (query->NextRow());
  138.  
  139.     delete query;
  140.     printf("[VehiclePowerUp] Loaded %u gameobject(s). \n", i);
  141. }
Add Comment
Please, Sign In to add comment