Hallo M2DL - Community,
zur Feier meines wiedererlangten DEV Rangs und auf Wunsch von CHXMVN wollt ich mit euch das Feature teilen, dass ausgewählte Monster nicht wegschlagbar sind.
So etwas Ähnliches gibt es auch schon, allerdings ist dort eine Hardcode Abfrage drin, dass ALLE Bosse (rank >= 4) nicht wegschlagbar sind. Ich habs mit einem ai_flag gelöst, sodass man pro Mob selbst entscheiden darf.
Serverdatenbank:
Unter player.mob_proto im Feld 'ai_flag' folgendes ganz unten einfügen: 'ANTI_KNOCKBACK'.
Client-Source:
PythonNonPlayer.h
Falls ihr die enum habt: "enum EAIFlags" ganz unten mit eurer folgenden Zahl einfügen:
- AIFLAG_ANTI_KNOCKBACK = (1 << EURE_ZAHL_DAVOR + 1),
So sieht es bei mir aus:
- enum EAIFlags
- {
- AIFLAG_AGGRESSIVE = (1 << 0),
- AIFLAG_NOMOVE = (1 << 1),
- AIFLAG_COWARD = (1 << 2),
- AIFLAG_NOATTACKSHINSU = (1 << 3),
- AIFLAG_NOATTACKJINNO = (1 << 4),
- AIFLAG_NOATTACKCHUNJO = (1 << 5),
- AIFLAG_ATTACKMOB = (1 << 6),
- AIFLAG_BERSERK = (1 << 7),
- AIFLAG_STONESKIN = (1 << 8),
- AIFLAG_GODSPEED = (1 << 9),
- AIFLAG_DEATHBLOW = (1 << 10),
- AIFLAG_REVIVE = (1 << 11),
- AIFLAG_ANTI_KNOCKBACK = (1 << 12),
- }
Alles anzeigen
InstanceBase.cpp
Folgendes suchen in der 'bool CInstanceBase::Create' Funktion:
- SetVirtualID(c_rkCreateData.m_dwVID);
- if (c_rkCreateData.m_isMain)
- SetMainInstance();
Darunter einfügen:
- if (!IsPC())
- {
- const CPythonNonPlayer::TMobTable* c_pTable = CPythonNonPlayer::instance().GetTable(c_rkCreateData.m_dwRace);
- if (c_pTable)
- {
- m_GraphicThingInstance.SetAntiKnockBack(IS_SET(c_pTable->dwAIFlag, CPythonNonPlayer::AIFLAG_ANTI_KNOCKBACK) != 0);
- }
- }
Falls nötig in der Datei ganz oben unter den includes einfügen:
- #include "PythonNonPlayer.h"
GameLib\ActorInstance.h
Irgendwo einfügen:
- public:
- void SetAntiKnockBack(bool value) { m_bAntiKnockback = value; };
- bool GetAntiKnockBack() { return m_bAntiKnockback; };
- private:
- bool m_bAntiKnockback;
GameLib\ActorInstance.cpp
In der 'void CActorInstance::__Initialize()' Funktion irgendwo einfügen:
- m_bAntiKnockback = false;
GameLib\ActorInstanceBattle.cpp:
In der 'bool CActorInstance::__CanPushDestActor' Funktion folgendes suchen:
- extern bool IS_HUGE_RACE(unsigned int vnum);
- if (IS_HUGE_RACE(rkActorDst.GetRace()))
- return false;
Darunter einfügen:
- if (rkActorDst.GetAntiKnockBack())
- return false;
Server-Source:
db\ProtoReader.cpp (Nur falls ihr txt nutzt)
suchen und am Ende ANTI_KNOCKBACK einfügen wie gewohnt.
common\length.h
Genau wie auf Clientseite auch wieder die "EAIFlags" enum bearbeiten. Müsste exakt so aussehen wie in der Client - Source. Und equvivalent zur Datenbank sein.
Abschließende Worte:
* mob_proto packen nicht vergessen!
* Falls benötigt dump_proto Source auch anpassen.
Viel Spaß damit, hoffe es ist ein schöner Zusatz zum public Zeugs!