Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Моды (http://mangos.ytdb.ru/forumdisplay.php?f=8)
-   -   add command killallnpc (http://mangos.ytdb.ru/showthread.php?t=3118)

Den 05.12.2010 20:14

add command killallnpc
 
Вспомнился старенький эмуль...
Получилось у меня сделать только с добавлением нового класса.
Что-то мне подсказывает, что это ох как не правильно =)))
Всё хорошо, кроме как ,если воспользоваться командой с мобов не собрать лут (отсутствует владелец).

PHP код:

diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index d526d26
..b4f5df4 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -708,+708,@@ ChatCommand ChatHandler::getCommandTable()
         { 
"recall",         SEC_MODERATOR,      false, &ChatHandler::HandleRecallCommand,              ""NULL },
         { 
"save",           SEC_PLAYER,         false, &ChatHandler::HandleSaveCommand,                ""NULL },
         { 
"saveall",        SEC_MODERATOR,      true,  &ChatHandler::HandleSaveAllCommand,             ""NULL },
+        { 
"killallnpc",     SEC_ADMINISTRATOR,  false, &ChatHandler::HandleKillAllNpcCommand,          ""NULL },
         { 
"kick",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleKickPlayerCommand,          ""NULL },
         { 
"ban",            SEC_ADMINISTRATOR,  true,  NULL,                                           ""banCommandTable      },
         { 
"unban",          SEC_ADMINISTRATOR,  true,  NULL,                                           ""unbanCommandTable    },
diff --git a/src/game/Chat.h b/src/game/Chat.h
index d85c3e7
..97097cf 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -532,+532,@@ class ChatHandler
         bool HandleGetDistanceCommand
(charargs);
         
bool HandleModifyStandStateCommand(charargs);
         
bool HandleDieCommand(charargs);
+        
bool HandleKillAllNpcCommand(charargs);
         
bool HandleDamageCommand(charargs);
         
bool HandleReviveCommand(charargs);
         
bool HandleModifyMorphCommand(charargs);
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index ec637db
..40b4e0b 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -1469,+1469,15 @@ bool Creature::FallGround()
     return 
true;
 }
 
+
void Creature::Kill()
+{            
+    if (
isAlive())
+    {
+        
SetDeathState(JUST_DIED);
+        
SetHealth(0);
+    }        
+}
+
 
void Creature::Respawn()
 {
     
RemoveCorpse();
diff --git a/src/game/Creature.h b/src/game/Creature.h
index 9d31181
..41a99c1 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -593,+593,@@ class MANGOS_DLL_SPEC Creature : public Unit
         void SetRespawnTime
(uint32 respawn) { m_respawnTime respawn time(NULL) + respawn 0; }
         
void Respawn();
         
void SaveRespawnTime();
+        
+        
void Kill();
 
         
uint32 GetRespawnDelay() const { return m_respawnDelay; }
         
void SetRespawnDelay(uint32 delay) { m_respawnDelay delay; }
diff --git a/src/game/GridNotifiers.cpp b/src/game/GridNotifiers.cpp
index ca2a774
..d4431fd 100644
--- a/src/game/GridNotifiers.cpp
+++ b/src/game/GridNotifiers.cpp
@@ -237,+237,13 @@ void MaNGOS::RespawnDo::operator()( GameObject) const
     
u->Respawn();
 }
 
+
void MaNGOS::KillDo::operator()( Creature) const
+{
+    
Mapmap u->GetMap();
+
+    
u->Kill();
+}
+
 
 
template void ObjectUpdater::Visit<GameObject>(GameObjectMapType &);
 
template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType &);
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h
index 45c6b90
..b633fe4 100644
--- a/src/game/GridNotifiers.h
+++ b/src/game/GridNotifiers.h
@@ -602,+602,13 @@ namespace MaNGOS
             float i_range
;
     };
 
+    class 
KillDo
+    {
+        public:
+            
KillDo() {}
+            
void operator()(Creatureu) const;
+    };
+    
     
// WorldObject do classes
 
     
class RespawnDo
diff 
--git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 3e3bb12
..233499c 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -3694,+3694,16 @@ bool ChatHandler::HandleDieCommand(char/*args*/)
     return 
true;
 }
 
+
bool ChatHandler::HandleKillAllNpcCommand(char/*args*/)
+{
+    
Playerpl m_session->GetPlayer();
+
+    
MaNGOS::KillDo u_do;
+    
MaNGOS::CreatureWorker<MaNGOS::KillDoworker(plu_do);
+    
Cell::VisitGridObjects(plworkerpl->GetMap()->GetVisibilityDistance());
+    return 
true;
+}
+     
 
bool ChatHandler::HandleDamageCommand(charargs)
 {
     if (!*
args



Код:

DELETE FROM `command` WHERE (`name`='killallnpc');
INSERT INTO `command` VALUES
('killallnpc',3,'Syntax: .killallnpc\r\n\r\nKill all npc.');


zergtmn 05.12.2010 21:26

В моды.

Forgotten 06.12.2010 18:30

если функтор используется в одном месте, то и делать его лучше видимым локально
Цитата:

Map* map = u->GetMap();
к чему это?

Den 01.05.2013 09:09

Вложений: 3
Да... глядя на тот г*вно код, что вверху, понимаешь, что время идет )))

Улучшенная версия:

1) Задается параметр дистанции на котором будут убиты существа.
2) Подсчитывает убитых существ.
3) Существ можно лутать.
4) Не задевает петов, вендоров, квестодателей.

Код:

diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 879d76d..7d817e0 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -786,6 +786,7 @@ ChatCommand* ChatHandler::getCommandTable()
        { "recall",        SEC_MODERATOR,      false, &ChatHandler::HandleRecallCommand,              "", NULL },
        { "save",          SEC_PLAYER,        false, &ChatHandler::HandleSaveCommand,                "", NULL },
        { "saveall",        SEC_MODERATOR,      true,  &ChatHandler::HandleSaveAllCommand,            "", NULL },
+        { "killallcreatures",SEC_ADMINISTRATOR,  false, &ChatHandler::HandleKillAllCreaturesCommand,    "", NULL },
        { "kick",          SEC_GAMEMASTER,    true,  &ChatHandler::HandleKickPlayerCommand,          "", NULL },
        { "ban",            SEC_ADMINISTRATOR,  true,  NULL,                                          "", banCommandTable      },
        { "unban",          SEC_ADMINISTRATOR,  true,  NULL,                                          "", unbanCommandTable    },
diff --git a/src/game/Chat.h b/src/game/Chat.h
index 306a98c..be00001 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -567,6 +567,7 @@ class MANGOS_DLL_SPEC ChatHandler
        bool HandleGetDistanceCommand(char* args);
        bool HandleModifyStandStateCommand(char* args);
        bool HandleDieCommand(char* args);
+        bool HandleKillAllCreaturesCommand(char* args);
        bool HandleDamageCommand(char* args);
        bool HandleReviveCommand(char* args);
        bool HandleModifyMorphCommand(char* args);
diff --git a/src/game/Language.h b/src/game/Language.h
index b6991c5..a2946f2 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -572,8 +572,9 @@ enum MangosStrings
    LANG_YOURS_EXPLORE_SET_ALL          = 553,
    LANG_YOURS_EXPLORE_SET_NOTHING      = 554,
 
-    //                                    555,              // not used
-    //                                    556,              // not used
+    LANG_NEED_PARAMETER_OF_DISTANCE    = 555,
+    LANG_DIES_CREATURES                = 556,
+
    LANG_YOURS_LEVEL_UP                = 557,
    LANG_YOURS_LEVEL_DOWN              = 558,
    LANG_YOURS_LEVEL_PROGRESS_RESET    = 559,
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index be3568b..d7d2be7 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -3868,6 +3868,56 @@ bool ChatHandler::HandleDieCommand(char* /*args*/)
    return true;
 }
 
+bool ChatHandler::HandleKillAllCreaturesCommand(char* args)
+{
+    if (!*args)
+    {
+        SendSysMessage(LANG_NEED_PARAMETER_OF_DISTANCE);
+        SetSentErrorMessage(true);
+        return false;
+    }
+
+    float radius = 0.0f;
+    ExtractFloat(&args, radius);
+
+    if (radius <= 0.0f || radius > DEFAULT_VISIBILITY_DISTANCE)
+    {
+        SendSysMessage(LANG_BAD_VALUE);
+        SetSentErrorMessage(true);
+        return false;
+    }
+
+    typedef std::list<Creature*> CreatureList;
+
+    CreatureList creatureTarget;
+
+    MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck checkCreature(m_session->GetPlayer(), m_session->GetPlayer(), radius);
+    MaNGOS::CreatureListSearcher<MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck> searcher(creatureTarget, checkCreature);
+    Cell::VisitGridObjects(m_session->GetPlayer(), searcher, radius);
+
+    if (creatureTarget.empty())
+    {
+        SendSysMessage(LANG_COMMAND_NOCREATUREFOUND);
+        SetSentErrorMessage(true);
+        return false;
+    }
+
+    uint32 dieCreaturesCount = 0;
+
+    for (CreatureList::iterator creature = creatureTarget.begin(); creature != creatureTarget.end(); ++creature)
+    {
+        if ((*creature)->isAlive() && !(*creature)->IsPet())
+        {
+            m_session->GetPlayer()->DealDamage((*creature), (*creature)->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+            ++dieCreaturesCount;
+        }
+    }
+
+    PSendSysMessage(LANG_DIES_CREATURES, dieCreaturesCount);
+
+    return true;
+}
+
 bool ChatHandler::HandleDamageCommand(char* args)
 {
    if (!*args)

Код:

DELETE FROM `command` WHERE (`name`='killallcreatures');
INSERT INTO `command` VALUES
('killallcreatures', 3, 'Kill all creatures #distance');

Код:

DELETE FROM `mangos_string` WHERE `entry` IN (555, 556);
INSERT INTO `mangos_string` VALUES
(555, 'Need parameter of distance.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(556, 'Dies creatures %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);



Текущее время: 12:18. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS