Skip to content

Commit

Permalink
Augment events (#39)
Browse files Browse the repository at this point in the history
* Augment Events

- Added Player Events (callbacks) onPlayerAugment, onRemovePlayerAugment
- Added Item Events (callbacks) onItemAugment, onRemoveItemAugment

* Change Event Names
  • Loading branch information
Codinablack authored Jan 1, 2025
1 parent 1dad540 commit 9bf85ed
Show file tree
Hide file tree
Showing 14 changed files with 242 additions and 37 deletions.
6 changes: 5 additions & 1 deletion data/events/events.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
<event class="Player" method="onInventoryUpdate" enabled="1" />
<event class="Player" method="onRotateItem" enabled="1" />
<event class="Player" method="onSpellTry" enabled="0" />
<event class="Player" method="onAugment" enabled="1" />
<event class="Player" method="onRemoveAugment" enabled="1" />

<!-- Monster methods -->
<event class="Monster" method="onDropLoot" enabled="1" />
Expand All @@ -47,7 +49,9 @@
<!-- Item methods -->
<event class="Item" method="onImbue" enabled="1"/>
<event class="Item" method="onRemoveImbue" enabled="1"/>
<!-- Offensive -->
<event class="Item" method="onAttack" enabled="0"/>
<event class="Item" method="onDefend" enabled="0"/>
<event class="Item" method="onAugment" enabled="1"/>
<event class="Item" method="onRemoveAugment" enabled="1"/>

</events>
20 changes: 17 additions & 3 deletions data/events/scripts/item.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,35 @@ end

function Item:onRemoveImbue(imbueType, decayRemoved)
local onRemoveImbue = EventCallback.onRemoveImbue
if EventCallback.onRemoveImbue then
if onRemoveImbue then
onRemoveImbue(self, imbueType, decayRemoved)
end
end

function Item:onAttack(player, creature, blockType, combatType)
local onAttack = EventCallback.onAttack
if EventCallback.onAttack then
if onAttack then
onAttack(self, player, creature, blockType, combatType)
end
end

function Item:onDefend(player, creature, blockType, combatType)
local onDefend = EventCallback.onDefend
if EventCallback.onDefend then
if onDefend then
onDefend(self, player, creature, blockType, combatType)
end
end

function Item:onAugment(augment)
local onAugment = EventCallback.onItemAugment
if onAugment then
onAugment(self, augment)
end
end

function Item:onRemoveAugment(augment)
local onRemoveAugment = EventCallback.onRemoveItemAugment
if onRemoveAugment then
onRemoveAugment(self, augment)
end
end
14 changes: 14 additions & 0 deletions data/events/scripts/player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -213,4 +213,18 @@ function Player:onSpellTry(spell, spellType)
return onSpellTry(self, spell, spellType)
end
return true
end

function Player:onAugment(augment)
local onAugment = EventCallback.onPlayerAugment
if onAugment then
onAugment(self, augment)
end
end

function Player:onRemoveAugment(augment)
local onRemoveAugment = EventCallback.onRemovePlayerAugment
if onRemoveAugment then
onRemoveAugment(self, augment)
end
end
2 changes: 0 additions & 2 deletions data/monster/monsters.xml
Original file line number Diff line number Diff line change
Expand Up @@ -741,6 +741,4 @@
<monster name="Zugurosh" file="monsters/zugurosh.xml" />
<monster name="Zulazza the Corruptor" file="monsters/zulazza_the_corruptor.xml" />
<monster name="Zushuka" file="monsters/zushuka.xml" />
<monster name ="Defense Monk" file = "monsters/defense_monk.xml"/>
<monster name ="Attack Monk" file = "monsters/attack_monk.xml"/>
</monsters>
8 changes: 8 additions & 0 deletions data/scripts/eventcallbacks/item/default_onAugment.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
local ec = EventCallback

ec.onItemAugment = function(self, augment)
-- default
return
end

ec:register()
8 changes: 8 additions & 0 deletions data/scripts/eventcallbacks/item/default_onRemoveAugment.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
local ec = EventCallback

ec.onRemoveItemAugment = function(self, augment)
-- default
return
end

ec:register()
8 changes: 8 additions & 0 deletions data/scripts/eventcallbacks/player/default_onAugment.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
local ec = EventCallback

ec.onPlayerAugment = function(self, augment)
-- default
return
end

ec:register()
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
local ec = EventCallback

ec.onRemovePlayerAugment = function(self, augment)
-- default
return
end

ec:register()
5 changes: 4 additions & 1 deletion data/scripts/lib/event_callbacks.lua
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,18 @@ ec.onWrapItem = {}
ec.onInventoryUpdate = {}
ec.onRotateItem = {}
ec.onSpellTry = {}
ec.onPlayerAugment = {}
ec.onRemovePlayerAugment = {}
-- Monster
ec.onDropLoot = {}
ec.onSpawn = {}
-- Item
ec.onImbue = {}
ec.onRemoveImbue = {}
-- Offensive
ec.onAttack = {}
ec.onDefend = {}
ec.onItemAugment = {}
ec.onRemoveItemAugment = {}

EventCallback = {
register = function(self, triggerIndex)
Expand Down
133 changes: 124 additions & 9 deletions src/events.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@ bool Events::load()
info.playerOnRotateItem = event;
} else if (methodName == "onSpellTry") {
info.playerOnSpellTry = event;
} else if (methodName == "onAugment") {
info.playerOnAugment = event;
} else if (methodName == "onRemoveAugment") {
info.playerOnRemoveAugment = event;
} else {
std::cout << "[Warning - Events::load] Unknown player method: " << methodName << std::endl;
}
Expand All @@ -142,7 +146,11 @@ bool Events::load()
info.itemOnAttack = event;
} else if (methodName == "onDefend") {
info.itemOnDefend = event;
}
} else if (methodName == "onAugment") {
info.itemOnAugment = event;
} else if (methodName == "onRemoveAugment") {
info.itemOnRemoveAugment = event;
}
} else {
std::cout << "[Warning - Events::load] Unknown class: " << className << std::endl;
}
Expand Down Expand Up @@ -1217,7 +1225,7 @@ void Events::eventPlayerOnRotateItem(Player* player, Item* item)
LuaScriptInterface::pushUserdata<Item>(L, item);
LuaScriptInterface::setItemMetatable(L, -1, item);

scriptInterface.callFunction(2);
scriptInterface.callVoidFunction(2);
}

bool Events::eventPlayerOnSpellTry(Player* player, const Spell* spell, SpellType_t spellType)
Expand All @@ -1243,9 +1251,62 @@ bool Events::eventPlayerOnSpellTry(Player* player, const Spell* spell, SpellType

LuaScriptInterface::pushSpell(L, *spell);

return scriptInterface.callFunction(2);
return scriptInterface.callFunction(3);
}

void Events::eventPlayerOnAugment(Player* player, std::shared_ptr<Augment> augment)
{
// Player:onAugment(augment)
if (info.playerOnAugment == -1) {
return;
}

if (!scriptInterface.reserveScriptEnv()) {
std::cout << "[Error - Events::eventPlayerOnAugment] Call stack overflow" << std::endl;
return;
}

ScriptEnvironment* env = scriptInterface.getScriptEnv();
env->setScriptId(info.playerOnAugment, &scriptInterface);

lua_State* L = scriptInterface.getLuaState();
scriptInterface.pushFunction(info.playerOnAugment);

LuaScriptInterface::pushUserdata<Player>(L, player);
LuaScriptInterface::setMetatable(L, -1, "Player");

LuaScriptInterface::pushSharedPtr<Augment>(L, augment);
LuaScriptInterface::setMetatable(L, -1, "Augment");

scriptInterface.callVoidFunction(2);
}

void Events::eventPlayerOnRemoveAugment(Player* player, std::shared_ptr<Augment> augment)
{
// Player:onRemoveAugment(augment)
if (info.playerOnRemoveAugment == -1) {
return;
}

if (!scriptInterface.reserveScriptEnv()) {
std::cout << "[Error - Events::eventPlayerOnRemoveAugment] Call stack overflow" << std::endl;
return;
}

ScriptEnvironment* env = scriptInterface.getScriptEnv();
env->setScriptId(info.playerOnRemoveAugment, &scriptInterface);

lua_State* L = scriptInterface.getLuaState();
scriptInterface.pushFunction(info.playerOnRemoveAugment);

LuaScriptInterface::pushUserdata<Player>(L, player);
LuaScriptInterface::setMetatable(L, -1, "Player");

LuaScriptInterface::pushSharedPtr<Augment>(L, augment);
LuaScriptInterface::setMetatable(L, -1, "Augment");

scriptInterface.callVoidFunction(2);
}

void Events::eventMonsterOnDropLoot(Monster* monster, Container* corpse)
{
Expand All @@ -1271,7 +1332,7 @@ void Events::eventMonsterOnDropLoot(Monster* monster, Container* corpse)
LuaScriptInterface::pushUserdata<Container>(L, corpse);
LuaScriptInterface::setMetatable(L, -1, "Container");

return scriptInterface.callVoidFunction(2);
scriptInterface.callVoidFunction(2);
}

bool Events::eventItemOnImbue(Item* item, std::shared_ptr<Imbuement> imbuement, bool created)
Expand Down Expand Up @@ -1327,7 +1388,7 @@ void Events::eventItemOnRemoveImbue(Item* item, ImbuementType imbueType, bool de
lua_pushinteger(L, static_cast<uint8_t>(imbueType));
LuaScriptInterface::pushBoolean(L, decayed);

return scriptInterface.callVoidFunction(3);
scriptInterface.callVoidFunction(3);
}

void Events::eventItemOnAttack(Item* item, Player* itemHolder, Creature* defender, BlockType_t blockType, CombatType_t combatType, CombatOrigin origin, bool criticalDamage, bool leechedDamage)
Expand Down Expand Up @@ -1364,7 +1425,7 @@ void Events::eventItemOnAttack(Item* item, Player* itemHolder, Creature* defende
lua_pushinteger(L, criticalDamage);
lua_pushinteger(L, leechedDamage);

return scriptInterface.callVoidFunction(8);
scriptInterface.callVoidFunction(8);
}

void Events::eventItemOnDefend(Item* item, Player* itemHolder, Creature* attacker, BlockType_t blockType, CombatType_t combatType, CombatOrigin origin, bool criticalDamage, bool leechedDamage)
Expand Down Expand Up @@ -1394,12 +1455,66 @@ void Events::eventItemOnDefend(Item* item, Player* itemHolder, Creature* attacke
LuaScriptInterface::pushUserdata<Creature>(L, attacker);
LuaScriptInterface::setCreatureMetatable(L, -1, attacker);

lua_pushinteger(L, static_cast<uint8_t>(blockType));
lua_pushinteger(L, blockType);
lua_pushinteger(L, static_cast<uint8_t>(combatType));
lua_pushinteger(L, static_cast<uint8_t>(origin));

lua_pushinteger(L, criticalDamage);
lua_pushinteger(L, leechedDamage);

return scriptInterface.callVoidFunction(8);
}
scriptInterface.callVoidFunction(8);
}

void Events::eventItemOnAugment(Item* item, std::shared_ptr<Augment> augment)
{
// Item:onAugment(augment)
if (info.itemOnAugment == -1) {
return;
}

if (!scriptInterface.reserveScriptEnv()) {
std::cout << "[Error - Events::eventItemOnAugment] Call stack overflow" << std::endl;
return;
}

ScriptEnvironment* env = scriptInterface.getScriptEnv();
env->setScriptId(info.itemOnAugment, &scriptInterface);

lua_State* L = scriptInterface.getLuaState();
scriptInterface.pushFunction(info.itemOnAugment);

LuaScriptInterface::pushUserdata<Item>(L, item);
LuaScriptInterface::setMetatable(L, -1, "Item");

LuaScriptInterface::pushSharedPtr<Augment>(L, augment);
LuaScriptInterface::setMetatable(L, -1, "Augment");

scriptInterface.callVoidFunction(2);
}

void Events::eventItemOnRemoveAugment(Item* item, std::shared_ptr<Augment> augment)
{
// Item:onRemoveAugment(augment)
if (info.itemOnRemoveAugment == -1) {
return;
}

if (!scriptInterface.reserveScriptEnv()) {
std::cout << "[Error - Events::eventItemOnRemoveAugment] Call stack overflow" << std::endl;
return;
}

ScriptEnvironment* env = scriptInterface.getScriptEnv();
env->setScriptId(info.itemOnRemoveAugment, &scriptInterface);

lua_State* L = scriptInterface.getLuaState();
scriptInterface.pushFunction(info.itemOnRemoveAugment);

LuaScriptInterface::pushUserdata<Item>(L, item);
LuaScriptInterface::setMetatable(L, -1, "Item");

LuaScriptInterface::pushSharedPtr<Augment>(L, augment);
LuaScriptInterface::setMetatable(L, -1, "Augment");

scriptInterface.callVoidFunction(2);
}
8 changes: 8 additions & 0 deletions src/events.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ class Events
int32_t playerOnInventoryUpdate = -1;
int32_t playerOnRotateItem = -1;
int32_t playerOnSpellTry = -1;
int32_t playerOnAugment = -1;
int32_t playerOnRemoveAugment = -1;

// Monster
int32_t monsterOnDropLoot = -1;
Expand All @@ -73,6 +75,8 @@ class Events
int32_t itemOnRemoveImbue = -1;
int32_t itemOnAttack = -1;
int32_t itemOnDefend = -1;
int32_t itemOnAugment = -1;
int32_t itemOnRemoveAugment = -1;

};

Expand Down Expand Up @@ -120,6 +124,8 @@ class Events
void eventPlayerOnInventoryUpdate(Player* player, Item* item, slots_t slot, bool equip);
void eventPlayerOnRotateItem(Player* player, Item* item);
bool eventPlayerOnSpellTry(Player* player, const Spell* spell, SpellType_t spellType);
void eventPlayerOnAugment(Player* player, std::shared_ptr<Augment> augment);
void eventPlayerOnRemoveAugment(Player* player, std::shared_ptr<Augment> augment);

// Monster
void eventMonsterOnDropLoot(Monster* monster, Container* corpse);
Expand All @@ -131,6 +137,8 @@ class Events

void eventItemOnAttack(Item* item, Player* itemHolder, Creature* defender, BlockType_t blockType, CombatType_t combatType, CombatOrigin origin, bool criticalDamage = false, bool leechedDamage = false);
void eventItemOnDefend(Item* item, Player* itemHolder, Creature* attacker, BlockType_t blockType, CombatType_t combatType, CombatOrigin origin, bool criticalDamage = false, bool leechedDamage = false);
void eventItemOnAugment(Item* item, std::shared_ptr<Augment> augment);
void eventItemOnRemoveAugment(Item* item, std::shared_ptr<Augment> augment);


int32_t getScriptId(EventInfoId eventInfoId) {
Expand Down
Loading

0 comments on commit 9bf85ed

Please sign in to comment.