From 4efda3e2e0b263e5df725d03c6d21e6ab44205af Mon Sep 17 00:00:00 2001 From: AURUMVORXX Date: Tue, 5 Nov 2024 23:44:22 +0300 Subject: [PATCH] feat: Added DamageDescription class + Added onPlayerDamage event --- g2o/__init__.py | 1 + g2o/damage.py | 58 ++++++++++++++++++++++++++++ g2o/events.py | 1 + src/bind.cpp | 21 +++++++++- src/classes/py/DamageDescription.h | 33 ++++++++++++++++ src/classes/py/Packet.h | 2 +- src/classes/sq/DamageDescription.cpp | 32 +++++++++++++++ src/classes/sq/DamageDescription.h | 27 +++++++++++++ src/classes/sq/Packet.h | 8 ++-- src/events/sqevents.cpp | 1 + src/events/sqevents.h | 1 + src/events/sqevents_player.cpp | 16 ++++++++ 12 files changed, 193 insertions(+), 8 deletions(-) create mode 100644 g2o/damage.py create mode 100644 src/classes/py/DamageDescription.h create mode 100644 src/classes/sq/DamageDescription.cpp create mode 100644 src/classes/sq/DamageDescription.h diff --git a/g2o/__init__.py b/g2o/__init__.py index afd6bd5..e9db344 100644 --- a/g2o/__init__.py +++ b/g2o/__init__.py @@ -5,5 +5,6 @@ from g2o.events import event from g2o.events import removeEventHandler from g2o.packets import Packet +from g2o.damage import DamageDescription from sqg2oconst import * \ No newline at end of file diff --git a/g2o/damage.py b/g2o/damage.py new file mode 100644 index 0000000..1732e6e --- /dev/null +++ b/g2o/damage.py @@ -0,0 +1,58 @@ +import sqg2o + +class DamageDescription(sqg2o.DamageDescription): + + def __init__(self): + return super().__init__() + + @property + def item_instance(self): + return super().item_instance + + @property + def flags(self): + return super().flags + + @flags.setter + def flags(self, value): + super().flags = value + + @property + def damage(self): + return super().damage + + @damage.setter + def damage(self, value): + super().damage = value + + @property + def distance(self): + return super().distance + + @distance.setter + def distance(self, value): + super().distance = value + + @property + def spell_id(self): + return super().spell_id + + @spell_id.setter + def spell_id(self, value): + super().spell_id = value + + @property + def spell_level(self): + return super().spell_level + + @spell_level.setter + def spell_level(self, value): + super().spell_level = value + + @property + def node(self): + return super().node + + @node.setter + def node(self, value): + super().node = value \ No newline at end of file diff --git a/g2o/events.py b/g2o/events.py index 2d83c54..1f9b707 100644 --- a/g2o/events.py +++ b/g2o/events.py @@ -138,6 +138,7 @@ addEvent('onPlayerChangeWeaponMode') addEvent('onPlayerChangeWorld') addEvent('onPlayerCommand') +addEvent('onPlayerDamage') addEvent('onPlayerDead') addEvent('onPlayerDisconnect') addEvent('onPlayerEnterWorld') diff --git a/src/bind.cpp b/src/bind.cpp index c8e9625..5abada1 100644 --- a/src/bind.cpp +++ b/src/bind.cpp @@ -1,10 +1,12 @@ #include #include "classes/py/Packet.h" +#include "classes/py/DamageDescription.h" #include namespace py = pybind11; PYBIND11_EMBEDDED_MODULE(sqg2o, m) { + py::class_(m, "Packet") .def(py::init<>()) .def("reset", &PyPacket::reset) @@ -30,6 +32,21 @@ PYBIND11_EMBEDDED_MODULE(sqg2o, m) { .def("readString", &PyPacket::readString) .def("__del__", &PyPacket::del) - .def_property_readonly("bitsUsed", &PyPacket::getBitsUsed) - .def_property_readonly("bytesUsed", &PyPacket::getBytesUsed); + .def_property_readonly("bitsUsed", &PyPacket::getBitsUsed) + .def_property_readonly("bytesUsed", &PyPacket::getBytesUsed); + +// ------------------------------------------------------------------------- + + py::class_(m, "DamageDescription") + .def(py::init<>()) + .def("__del__", &PyDamageDescription::del) + + .def_property_readonly("item_instance", &PyDamageDescription::getItemInstance) + + .def_property("flags", &PyDamageDescription::getFlags, &PyDamageDescription::setFlags, py::return_value_policy::reference_internal) + .def_property("damage", &PyDamageDescription::getDamage, &PyDamageDescription::setDamage, py::return_value_policy::reference_internal) + .def_property("distance", &PyDamageDescription::getDistance, &PyDamageDescription::setDistance, py::return_value_policy::reference_internal) + .def_property("spell_id", &PyDamageDescription::getSpellId, &PyDamageDescription::setSpellId, py::return_value_policy::reference_internal) + .def_property("spell_level", &PyDamageDescription::getSpellLevel, &PyDamageDescription::setSpellLevel, py::return_value_policy::reference_internal) + .def_property("node", &PyDamageDescription::getNode, &PyDamageDescription::setNode, py::return_value_policy::reference_internal); } \ No newline at end of file diff --git a/src/classes/py/DamageDescription.h b/src/classes/py/DamageDescription.h new file mode 100644 index 0000000..c20dc63 --- /dev/null +++ b/src/classes/py/DamageDescription.h @@ -0,0 +1,33 @@ +#ifndef _PYDAMAGEDESCRIPTION_H +#define _PYDAMAGEDESCRIPTION_H + +#include + +class PyDamageDescription +{ +private: + nonut::DamageDescription *sqobj; + +public: + PyDamageDescription() { sqobj = new nonut::DamageDescription(); }; + PyDamageDescription(SQObject obj) { sqobj = new nonut::DamageDescription(obj); } + + nonut::Int getFlags() { return sqobj->flags; } + nonut::Int getDamage() { return sqobj->damage; } + nonut::String getItemInstance() { return sqobj->item_instance; } + nonut::Int getDistance() { return sqobj->distance; } + nonut::Int getSpellId() { return sqobj->spell_id; } + nonut::Int getSpellLevel() { return sqobj->spell_level; } + nonut::String getNode() { return sqobj->node; } + + void setFlags(nonut::Int value) { sqobj->flags = value; } + void setDamage(nonut::Int value) { sqobj->damage = value; } + void setDistance(nonut::Int value) { sqobj->distance = value; } + void setSpellId(nonut::Int value) { sqobj->spell_id = value; } + void setSpellLevel(nonut::Int value) { sqobj->spell_level = value; } + void setNode(nonut::String value) { sqobj->node = value; } + + void del() { delete sqobj; } +}; + +#endif \ No newline at end of file diff --git a/src/classes/py/Packet.h b/src/classes/py/Packet.h index e44bda6..ab2ad03 100644 --- a/src/classes/py/Packet.h +++ b/src/classes/py/Packet.h @@ -1,5 +1,5 @@ #ifndef _PYPACKET_H_ -#define _PYPACKET_ +#define _PYPACKET_H_ #include diff --git a/src/classes/sq/DamageDescription.cpp b/src/classes/sq/DamageDescription.cpp new file mode 100644 index 0000000..62e3194 --- /dev/null +++ b/src/classes/sq/DamageDescription.cpp @@ -0,0 +1,32 @@ +#include +#include "DamageDescription.h" + +namespace nonut +{ + DamageDescription::DamageDescription() : + Class("DamageDescription"), + + PROPERTY_CTOR(flags), + PROPERTY_CTOR(damage), + PROPERTY_CTOR(item_instance), + PROPERTY_CTOR(distance), + PROPERTY_CTOR(spell_id), + PROPERTY_CTOR(spell_level), + PROPERTY_CTOR(node) + { + classCtor(); + } + + DamageDescription::DamageDescription(SQObject object) : + Class("DamageDescription", object), + + PROPERTY_CTOR(flags), + PROPERTY_CTOR(damage), + PROPERTY_CTOR(item_instance), + PROPERTY_CTOR(distance), + PROPERTY_CTOR(spell_id), + PROPERTY_CTOR(spell_level), + PROPERTY_CTOR(node) + { + } +} diff --git a/src/classes/sq/DamageDescription.h b/src/classes/sq/DamageDescription.h new file mode 100644 index 0000000..7600b74 --- /dev/null +++ b/src/classes/sq/DamageDescription.h @@ -0,0 +1,27 @@ +#ifndef _DAMAGEDESCRIPTION_H_ +#define _DAMAGEDESCRIPTION_H_ +#include + +#include +#include + +namespace nonut +{ + class DamageDescription : public Class + { + public: + DamageDescription(); + explicit DamageDescription(SQObject object); + + // Properties + Property flags; + Property damage; + Property item_instance; + Property distance; + Property spell_id; + Property spell_level; + Property node; + }; +} +#endif + diff --git a/src/classes/sq/Packet.h b/src/classes/sq/Packet.h index db74606..c9aad65 100644 --- a/src/classes/sq/Packet.h +++ b/src/classes/sq/Packet.h @@ -1,5 +1,5 @@ -#ifndef NONUT_G2O_SERVER_CLASS_PACKET -#define NONUT_G2O_SERVER_CLASS_PACKET +#ifndef _PACKET_H_ +#define _PACKET_H_ #include #include @@ -13,7 +13,6 @@ namespace nonut Packet(); explicit Packet(SQObject object); - // Methods Function reset; Function send; Function sendToAll; @@ -36,10 +35,9 @@ namespace nonut Function readFloat; Function readString; - // Properties Property bitsUsed; Property bytesUsed; }; } -#endif // NONUT_G2O_SERVER_CLASS_PACKET +#endif diff --git a/src/events/sqevents.cpp b/src/events/sqevents.cpp index 416326e..f49254d 100644 --- a/src/events/sqevents.cpp +++ b/src/events/sqevents.cpp @@ -61,6 +61,7 @@ void registerSquirrelEvents() addEventHandler("onPlayerChangeWorld", sq_onPlayerChangeWorld, 0); addEventHandler("onPlayerCommand", sq_onPlayerCommand, 0); + addEventHandler("onPlayerDamage", sq_onPlayerDamage, 0); addEventHandler("onPlayerDead", sq_onPlayerDead, 0); addEventHandler("onPlayerDisconnect", sq_onPlayerDisconnect, 0); addEventHandler("onPlayerEnterWorld", sq_onPlayerEnterWorld, 0); diff --git a/src/events/sqevents.h b/src/events/sqevents.h index fb98d8d..2ef9d1e 100644 --- a/src/events/sqevents.h +++ b/src/events/sqevents.h @@ -22,6 +22,7 @@ SQInteger sq_onPlayerChangeMaxMana(HSQUIRRELVM); SQInteger sq_onPlayerChangeWeaponMode(HSQUIRRELVM); SQInteger sq_onPlayerChangeWorld(HSQUIRRELVM); SQInteger sq_onPlayerCommand(HSQUIRRELVM); +SQInteger sq_onPlayerDamage(HSQUIRRELVM); SQInteger sq_onPlayerDead(HSQUIRRELVM); SQInteger sq_onPlayerDisconnect(HSQUIRRELVM); SQInteger sq_onPlayerEnterWorld(HSQUIRRELVM); diff --git a/src/events/sqevents_player.cpp b/src/events/sqevents_player.cpp index 32af7c4..91e5d04 100644 --- a/src/events/sqevents_player.cpp +++ b/src/events/sqevents_player.cpp @@ -1,6 +1,7 @@ #include #include #include "NoNut/core/Utils.h" +#include #include "sqevents.h" namespace py = pybind11; @@ -141,6 +142,21 @@ SQInteger sq_onPlayerCommand(HSQUIRRELVM vm) return 0; } +SQInteger sq_onPlayerDamage(HSQUIRRELVM vm) +{ + SQInteger playerid, killerid; + HSQOBJECT sqobj; + + nonut::sqGetValue(vm, 2, &playerid); + nonut::sqGetValue(vm, 3, &killerid); + nonut::sqGetValue(vm, 4, &sqobj); + + py::dict kwargs = py::dict("playerid"_a=playerid, "killerid"_a=killerid, "description"_a=PyDamageDescription(sqobj)); + callEvent("onPlayerDamage", kwargs); + + return 0; +} + SQInteger sq_onPlayerDead(HSQUIRRELVM vm) { SQInteger playerid, killerid;