HookNotify: Rewritten for generic hooks.
This commit is contained in:
parent
a34aa77641
commit
ec741261f9
@ -1,457 +1,65 @@
|
||||
|
||||
-- Global variables
|
||||
PLUGIN = {} -- Reference to own plugin object
|
||||
-- HookNotify.lua
|
||||
|
||||
--[[
|
||||
Implements the entire plugin
|
||||
|
||||
NOTE: This plugin is not meant for production servers. It is used mainly by developers to verify that things
|
||||
are working properly when implementing MCServer features. Do not enable this plugin on production servers!
|
||||
|
||||
This plugin logs a notification for each hook that is being called by the server.
|
||||
The TICK and WORLD_TICK hooks are disabled because they produce too much output.
|
||||
--]]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function Initialize(Plugin)
|
||||
PLUGIN = Plugin
|
||||
|
||||
Plugin:SetName("HookNotify");
|
||||
Plugin:SetVersion(1);
|
||||
|
||||
PluginManager = cPluginManager:Get();
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_BLOCK_TO_PICKUPS, OnBlockToPickups);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_CHAT, OnChat);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_CHUNK_AVAILABLE, OnChunkAvailable);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_CHUNK_GENERATED, OnChunkGenerated);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_CHUNK_GENERATING, OnChunkGenerating);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_CHUNK_UNLOADED, OnChunkUnloaded);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_CHUNK_UNLOADING, OnChunkUnloading);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_COLLECTING_PICKUP, OnCollectingPickup);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_CRAFTING_NO_RECIPE, OnCraftingNoRecipe);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_DISCONNECT, OnDisconnect);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_ENTITY_TELEPORT, OnEntityTeleport);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_EXECUTE_COMMAND, OnExecuteCommand);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_HANDSHAKE, OnHandshake);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_KILLING, OnKilling);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_LOGIN, OnLogin);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_BREAKING_BLOCK, OnPlayerBreakingBlock);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_BROKEN_BLOCK, OnPlayerBrokenBlock);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_EATING, OnPlayerEating);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_JOINED, OnPlayerJoined);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_LEFT_CLICK, OnPlayerLeftClick);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_MOVING, OnPlayerMoving);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_PLACED_BLOCK, OnPlayerPlacedBlock);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_PLACING_BLOCK, OnPlayerPlacingBlock);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_RIGHT_CLICK, OnPlayerRightClick);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_SHOOTING, OnPlayerShooting);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_SPAWNED, OnPlayerSpawned);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_TOSSING_ITEM, OnPlayerTossingItem);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_USED_BLOCK, OnPlayerUsedBlock);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_USED_ITEM, OnPlayerUsedItem);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_USING_BLOCK, OnPlayerUsingBlock);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_USING_ITEM, OnPlayerUsingItem);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_POST_CRAFTING, OnPostCrafting);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PRE_CRAFTING, OnPreCrafting);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_SPAWNED_ENTITY, OnSpawnedEntity);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_SPAWNED_MONSTER, OnSpawnedMonster);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_SPAWNING_ENTITY, OnSpawningEntity);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_SPAWNING_MONSTER, OnSpawningMonster);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_TAKE_DAMAGE, OnTakeDamage);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_UPDATED_SIGN, OnUpdatedSign);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_UPDATING_SIGN, OnUpdatingSign);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_WEATHER_CHANGED, OnWeatherChanged);
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_WEATHER_CHANGING, OnWeatherChanging);
|
||||
|
||||
function Initialize(a_Plugin)
|
||||
-- Notify the admin that HookNotify is installed, this is not meant for production servers
|
||||
LOGINFO("HookNotify plugin is installed, beware, the log output may be quite large!");
|
||||
LOGINFO("You want this plugin enabled only when developing another plugin, not for regular gameplay.");
|
||||
|
||||
-- These hooks will not be notified:
|
||||
local hooksToIgnore =
|
||||
{
|
||||
["HOOK_TICK"] = true, -- Too much spam
|
||||
["HOOK_WORLD_TICK"] = true, -- Too much spam
|
||||
["HOOK_TAKE_DAMAGE"] = true, -- Has a separate handler with more info logged
|
||||
["HOOK_MAX"] = true, -- No such hook, placeholder only
|
||||
["HOOK_NUM_HOOKS"] = true, -- No such hook, placeholder only
|
||||
}
|
||||
|
||||
-- Add all hooks:
|
||||
for n, v in pairs(cPluginManager) do
|
||||
if (n:match("HOOK_.*")) then
|
||||
if not(hooksToIgnore[n]) then
|
||||
LOG("Adding notification for hook " .. n .. " (" .. v .. ").")
|
||||
cPluginManager.AddHook(v,
|
||||
function (...)
|
||||
LOG(n .. "(")
|
||||
for i, param in ipairs(arg) do
|
||||
LOG(" " .. i .. ": " .. tolua.type(param) .. ": " .. tostring(param))
|
||||
end
|
||||
LOG(")");
|
||||
end -- hook handler
|
||||
) -- AddHook
|
||||
end -- not (ignore)
|
||||
end -- n matches "HOOK"
|
||||
end -- for cPluginManager{}
|
||||
|
||||
-- OnTakeDamage has a special handler listing the details of the damage dealt:
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_TAKE_DAMAGE,
|
||||
function (a_Receiver, a_TDI)
|
||||
-- a_Receiver is cPawn
|
||||
-- a_TDI is TakeDamageInfo
|
||||
|
||||
LOG("OnTakeDamage(): " .. a_Receiver:GetClass() .. " was dealt RawDamage " .. a_TDI.RawDamage .. ", FinalDamage " .. a_TDI.FinalDamage .. " (that is, " .. (a_TDI.RawDamage - a_TDI.FinalDamage) .. " HPs covered by armor)");
|
||||
end
|
||||
)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function LogHook(FnName, ...)
|
||||
LOG(FnName .. "(");
|
||||
for i, v in ipairs(arg) do
|
||||
local vt = tostring(v);
|
||||
local TypeString = type(v);
|
||||
if (type(v) == "userdata") then
|
||||
TypeString = tolua.type(v);
|
||||
end;
|
||||
LOG(" " .. tostring(i) .. ": " .. TypeString .. ": " .. tostring(v));
|
||||
end
|
||||
LOG(")");
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnBlockToPickups(...)
|
||||
LogHook("OnBlockToPickups", unpack(arg));
|
||||
local World, Digger, BlockX, BlockY, BlockZ, BlockType, BlockMeta, Pickups = unpack(arg);
|
||||
if (Pickups ~= nil) then
|
||||
local Name = "NULL";
|
||||
if (Digger ~= nil) then
|
||||
Name = Digger:GetName()
|
||||
end
|
||||
LOG("Got cItems from " .. Name .. ", trying to manipulate them.");
|
||||
Pickups:Add(cItem:new(E_ITEM_DIAMOND_SHOVEL, 1));
|
||||
LOG("Current size: " .. Pickups:Size());
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnChat(...)
|
||||
LogHook("OnChat", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnChunkAvailable(...)
|
||||
LogHook("OnChunkAvailable", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnChunkGenerated(...)
|
||||
LogHook("OnChunkGenerated", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnChunkGenerating(...)
|
||||
LogHook("OnChunkGenerating", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnChunkUnloaded(...)
|
||||
LogHook("OnChunkUnloaded", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnChunkUnloading(...)
|
||||
LogHook("OnChunkUnloading", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerUsingItem(...)
|
||||
LogHook("OnPlayerUsingItem", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnCollectingPickup(...)
|
||||
LogHook("OnCollectingPickup", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
function OnCraftingNoRecipe(...)
|
||||
LogHook("OnCraftingNoRecipe", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnDisconnect(...)
|
||||
LogHook("OnDisconnect", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnEntityTeleport(arg1,arg2,arg3)
|
||||
if arg1.IsPlayer() then
|
||||
-- if it's a player, get his name
|
||||
LOG("OnEntityTeleport: Player: " .. arg1.GetName());
|
||||
else
|
||||
-- if it's a entity, get its type
|
||||
LOG("OnEntityTeleport: EntityType: " .. arg1.GetEntityType());
|
||||
end
|
||||
LOG("OldPos: " .. arg2.x .. " / " .. arg2.y .. " / " .. arg2.z);
|
||||
LOG("NewPos: " .. arg3.x .. " / " .. arg3.y .. " / " .. arg3.z);
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnExecuteCommand(...)
|
||||
LogHook("OnExecuteCommand", unpack(arg));
|
||||
|
||||
-- For some reason logging doesn't work for this callback, so list some stuff manually to verify:
|
||||
LOG("arg1 type: " .. type(arg[1]));
|
||||
if (arg[1] ~= nil) then
|
||||
LOG("Player name: " .. arg[1]:GetName());
|
||||
end
|
||||
LOG("Command: " .. arg[2][1]);
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnHandshake(...)
|
||||
LogHook("OnHandshake", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnKilling(...)
|
||||
LogHook("OnKilling", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnLogin(...)
|
||||
LogHook("OnLogin", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerBreakingBlock(...)
|
||||
LogHook("OnPlayerBreakingBlock", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerBrokenBlock(...)
|
||||
LogHook("OnPlayerBrokenBlock", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerEating(...)
|
||||
LogHook("OnPlayerEating", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerJoined(...)
|
||||
LogHook("OnPlayerJoined", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerLeftClick(...)
|
||||
LogHook("OnPlayerLeftClick", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerMoving(...)
|
||||
LogHook("OnPlayerMoving", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerPlacedBlock(...)
|
||||
LogHook("OnPlayerPlacedBlock", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerPlacingBlock(...)
|
||||
LogHook("OnPlayerPlacingBlock", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerRightClick(...)
|
||||
LogHook("OnPlayerRightClick", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerShooting(...)
|
||||
LogHook("OnPlayerShooting", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerSpawned(...)
|
||||
LogHook("OnPlayerSpawned", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerTossingItem(...)
|
||||
LogHook("OnPlayerTossingItem", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerUsedBlock(...)
|
||||
LogHook("OnPlayerUsedBlock", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerUsedItem(...)
|
||||
LogHook("OnPlayerUsedItem", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerUsingBlock(...)
|
||||
LogHook("OnPlayerUsingBlock", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPlayerUsingItem(...)
|
||||
LogHook("OnPlayerUsingItem", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPostCrafting(...)
|
||||
LogHook("OnPostCrafting", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnPreCrafting(...)
|
||||
LogHook("OnPreCrafting", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnSpawnedEntity(...)
|
||||
LogHook("OnSpawnedEntity", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnSpawnedMonster(...)
|
||||
LogHook("OnSpawnedMonster", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnSpawningEntity(...)
|
||||
LogHook("OnSpawningEntity", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnSpawningMonster(...)
|
||||
LogHook("OnSpawningMonster", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnUpdatedSign(...)
|
||||
LogHook("OnUpdatedSign", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnUpdatingSign(...)
|
||||
LogHook("OnUpdatingSign", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnWeatherChanged(...)
|
||||
LogHook("OnWeatherChanged", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function OnWeatherChanging(...)
|
||||
LogHook("OnWeatherChanging", unpack(arg));
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
------------------------------------------------------------------
|
||||
-- Special handling for OnTakeDamage to print the contents of TDI:
|
||||
|
||||
function OnTakeDamage(Receiver, TDI)
|
||||
-- Receiver is cPawn
|
||||
-- TDI is TakeDamageInfo
|
||||
|
||||
LOG("OnTakeDamage(): " .. Receiver:GetClass() .. " was dealt RawDamage " .. TDI.RawDamage .. ", FinalDamage " .. TDI.FinalDamage .. " (that is, " .. (TDI.RawDamage - TDI.FinalDamage) .. " HPs covered by armor)");
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user