Merge pull request #1858 from mc-server/BucketPluginCalls
Bucket plugin calls
This commit is contained in:
commit
1d8a22cb7b
@ -2031,8 +2031,6 @@ cPluginManager.AddHook(cPluginManager.HOOK_CHAT, OnChatMessage);
|
|||||||
HOOK_HOPPER_PUSHING_ITEM = { Notes = "Called when a hopper is pushing an item into the container it is aimed at." },
|
HOOK_HOPPER_PUSHING_ITEM = { Notes = "Called when a hopper is pushing an item into the container it is aimed at." },
|
||||||
HOOK_KILLING = { Notes = "Called when an entity has just been killed. A plugin may resurrect the entity by setting its health to above zero." },
|
HOOK_KILLING = { Notes = "Called when an entity has just been killed. A plugin may resurrect the entity by setting its health to above zero." },
|
||||||
HOOK_LOGIN = { Notes = "Called when a Login packet is sent to the client, before the client is queued for authentication." },
|
HOOK_LOGIN = { Notes = "Called when a Login packet is sent to the client, before the client is queued for authentication." },
|
||||||
HOOK_MAX = { Notes = "The maximum TypeID of a hook. Used internally by MCS to check hook type for validity." },
|
|
||||||
HOOK_NUM_HOOKS = { Notes = "Total number of hook types MCS supports. Used internally by MCS to check hook type for validity." },
|
|
||||||
HOOK_PLAYER_ANIMATION = { Notes = "Called when a client send the Animation packet." },
|
HOOK_PLAYER_ANIMATION = { Notes = "Called when a client send the Animation packet." },
|
||||||
HOOK_PLAYER_BREAKING_BLOCK = { Notes = "Called when a player is about to break a block. A plugin may cancel the event." },
|
HOOK_PLAYER_BREAKING_BLOCK = { Notes = "Called when a player is about to break a block. A plugin may cancel the event." },
|
||||||
HOOK_PLAYER_BROKEN_BLOCK = { Notes = "Called after a player has broken a block." },
|
HOOK_PLAYER_BROKEN_BLOCK = { Notes = "Called after a player has broken a block." },
|
||||||
|
@ -1,457 +1,65 @@
|
|||||||
|
|
||||||
-- Global variables
|
-- HookNotify.lua
|
||||||
PLUGIN = {} -- Reference to own plugin object
|
|
||||||
|
--[[
|
||||||
|
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)
|
function Initialize(a_Plugin)
|
||||||
PLUGIN = Plugin
|
-- Notify the admin that HookNotify is installed, this is not meant for production servers
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
LOGINFO("HookNotify plugin is installed, beware, the log output may be quite large!");
|
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.");
|
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
|
return true
|
||||||
end
|
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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -134,6 +134,8 @@ public:
|
|||||||
HOOK_WEATHER_CHANGING,
|
HOOK_WEATHER_CHANGING,
|
||||||
HOOK_WORLD_STARTED,
|
HOOK_WORLD_STARTED,
|
||||||
HOOK_WORLD_TICK,
|
HOOK_WORLD_TICK,
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
// Note that if a hook type is added, it may need processing in cPlugin::CanAddHook() descendants,
|
// Note that if a hook type is added, it may need processing in cPlugin::CanAddHook() descendants,
|
||||||
// and it definitely needs adding in cPluginLua::GetHookFnName() !
|
// and it definitely needs adding in cPluginLua::GetHookFnName() !
|
||||||
@ -141,8 +143,7 @@ public:
|
|||||||
// Keep these two as the last items, they are used for validity checking and get their values automagically
|
// Keep these two as the last items, they are used for validity checking and get their values automagically
|
||||||
HOOK_NUM_HOOKS,
|
HOOK_NUM_HOOKS,
|
||||||
HOOK_MAX = HOOK_NUM_HOOKS - 1,
|
HOOK_MAX = HOOK_NUM_HOOKS - 1,
|
||||||
} ;
|
} ; // tolua_export
|
||||||
// tolua_end
|
|
||||||
|
|
||||||
/** Used as a callback for enumerating bound commands */
|
/** Used as a callback for enumerating bound commands */
|
||||||
class cCommandEnumCallback
|
class cCommandEnumCallback
|
||||||
|
@ -1,4 +1,12 @@
|
|||||||
|
|
||||||
|
// BlockInServerPluginInterface.h
|
||||||
|
|
||||||
|
// Defines the cBlockInServerPluginInterface class that implements the cBlockPluginInterface for blocks, using the plugin manager
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Blocks/BlockPluginInterface.h"
|
#include "Blocks/BlockPluginInterface.h"
|
||||||
@ -16,7 +24,7 @@ class cBlockInServerPluginInterface :
|
|||||||
public:
|
public:
|
||||||
cBlockInServerPluginInterface(cWorld & a_World) : m_World(a_World) {}
|
cBlockInServerPluginInterface(cWorld & a_World) : m_World(a_World) {}
|
||||||
|
|
||||||
virtual bool CallHookBlockSpread(int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source)
|
virtual bool CallHookBlockSpread(int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source) override
|
||||||
{
|
{
|
||||||
return cPluginManager::Get()->CallHookBlockSpread(m_World, a_BlockX, a_BlockY, a_BlockZ, a_Source);
|
return cPluginManager::Get()->CallHookBlockSpread(m_World, a_BlockX, a_BlockY, a_BlockZ, a_Source);
|
||||||
}
|
}
|
||||||
@ -26,6 +34,16 @@ public:
|
|||||||
return cPluginManager::Get()->CallHookBlockToPickups(m_World, a_Digger, a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_Pickups);
|
return cPluginManager::Get()->CallHookBlockToPickups(m_World, a_Digger, a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_Pickups);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool CallHookPlayerBreakingBlock(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override
|
||||||
|
{
|
||||||
|
return cPluginManager::Get()->CallHookPlayerBreakingBlock(a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_BlockType, a_BlockMeta);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool CallHookPlayerBrokenBlock(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override
|
||||||
|
{
|
||||||
|
return cPluginManager::Get()->CallHookPlayerBrokenBlock(a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_BlockType, a_BlockMeta);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cWorld & m_World;
|
cWorld & m_World;
|
||||||
};
|
};
|
||||||
|
@ -1,10 +1,25 @@
|
|||||||
|
|
||||||
|
// BlockPluginInterface.h
|
||||||
|
|
||||||
|
// Declares the cBlockPluginInterface class representing an interface that the blockhandlers and itemhandlers use for calling plugins
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// fwd:
|
||||||
|
class cPlayer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** This interface is used to decouple block handlers from the cPluginManager dependency through cWorld.
|
/** This interface is used to decouple block handlers from the cPluginManager dependency through cWorld.
|
||||||
The block handlers call this interface, which is then implemented by the specific classes that
|
The block handlers call this interface, which is then implemented by the specific classes that
|
||||||
the caller provides.
|
the caller provides.
|
||||||
@ -16,6 +31,8 @@ public:
|
|||||||
|
|
||||||
virtual bool CallHookBlockSpread(int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source) = 0;
|
virtual bool CallHookBlockSpread(int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source) = 0;
|
||||||
virtual bool CallHookBlockToPickups(cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, cItems & a_Pickups) = 0;
|
virtual bool CallHookBlockToPickups(cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, cItems & a_Pickups) = 0;
|
||||||
|
virtual bool CallHookPlayerBreakingBlock(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
|
||||||
|
virtual bool CallHookPlayerBrokenBlock(cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "Blocks/BlockSlab.h"
|
#include "Blocks/BlockSlab.h"
|
||||||
#include "Blocks/BlockBed.h"
|
#include "Blocks/BlockBed.h"
|
||||||
#include "Blocks/ChunkInterface.h"
|
#include "Blocks/ChunkInterface.h"
|
||||||
|
#include "BlockInServerPluginInterface.h"
|
||||||
|
|
||||||
#include "Root.h"
|
#include "Root.h"
|
||||||
|
|
||||||
@ -1432,7 +1433,8 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e
|
|||||||
// A plugin doesn't agree with using the item, abort
|
// A plugin doesn't agree with using the item, abort
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ItemHandler->OnItemUse(World, m_Player, Equipped, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
cBlockInServerPluginInterface PluginInterface(*World);
|
||||||
|
ItemHandler->OnItemUse(World, m_Player, PluginInterface, Equipped, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
||||||
PlgMgr->CallHookPlayerUsedItem(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ);
|
PlgMgr->CallHookPlayerUsedItem(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,13 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Move the armor to the armor slot of the player's inventory */
|
/** Move the armor to the armor slot of the player's inventory */
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
int SlotNum;
|
int SlotNum;
|
||||||
if (ItemCategory::IsHelmet(a_Item.m_ItemType))
|
if (ItemCategory::IsHelmet(a_Item.m_ItemType))
|
||||||
@ -60,6 +65,8 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual bool CanRepairWithRawMaterial(short a_ItemType) override
|
virtual bool CanRepairWithRawMaterial(short a_ItemType) override
|
||||||
{
|
{
|
||||||
switch (m_ItemType)
|
switch (m_ItemType)
|
||||||
|
@ -28,9 +28,12 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if ((a_Dir != BLOCK_FACE_YM) && (a_Dir != BLOCK_FACE_NONE))
|
if ((a_BlockFace != BLOCK_FACE_YM) && (a_BlockFace != BLOCK_FACE_NONE))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -26,8 +26,12 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
ASSERT(a_Player != nullptr);
|
ASSERT(a_Player != nullptr);
|
||||||
|
|
||||||
@ -40,6 +44,7 @@ public:
|
|||||||
a_Player->StartChargingBow();
|
a_Player->StartChargingBow();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual void OnItemShoot(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override
|
virtual void OnItemShoot(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override
|
||||||
|
@ -23,13 +23,18 @@ public:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
switch (m_ItemType)
|
switch (m_ItemType)
|
||||||
{
|
{
|
||||||
case E_ITEM_BUCKET: return ScoopUpFluid(a_World, a_Player, a_Item, a_BlockX, a_BlockY, a_BlockZ, a_Dir);
|
case E_ITEM_BUCKET: return ScoopUpFluid(a_World, a_Player, a_Item, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
||||||
case E_ITEM_LAVA_BUCKET: return PlaceFluid (a_World, a_Player, a_Item, a_BlockX, a_BlockY, a_BlockZ, a_Dir, E_BLOCK_LAVA);
|
case E_ITEM_LAVA_BUCKET: return PlaceFluid (a_World, a_Player, a_PluginInterface, a_Item, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, E_BLOCK_LAVA);
|
||||||
case E_ITEM_WATER_BUCKET: return PlaceFluid (a_World, a_Player, a_Item, a_BlockX, a_BlockY, a_BlockZ, a_Dir, E_BLOCK_WATER);
|
case E_ITEM_WATER_BUCKET: return PlaceFluid (a_World, a_Player, a_PluginInterface, a_Item, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, E_BLOCK_WATER);
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
ASSERT(!"Unhandled ItemType");
|
ASSERT(!"Unhandled ItemType");
|
||||||
@ -40,7 +45,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool ScoopUpFluid(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace)
|
bool ScoopUpFluid(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace)
|
||||||
{
|
{
|
||||||
if (a_BlockFace != BLOCK_FACE_NONE)
|
if (a_BlockFace != BLOCK_FACE_NONE)
|
||||||
{
|
{
|
||||||
@ -75,6 +80,12 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove water / lava block (unless plugins disagree)
|
||||||
|
if (!a_Player->PlaceBlock(BlockPos.x, BlockPos.y, BlockPos.z, E_BLOCK_AIR, 0))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Give new bucket, filled with fluid when the gamemode is not creative:
|
// Give new bucket, filled with fluid when the gamemode is not creative:
|
||||||
if (!a_Player->IsGameModeCreative())
|
if (!a_Player->IsGameModeCreative())
|
||||||
{
|
{
|
||||||
@ -85,25 +96,33 @@ public:
|
|||||||
ASSERT(!"Inventory bucket mismatch");
|
ASSERT(!"Inventory bucket mismatch");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
a_Player->GetInventory().AddItem(cItem(NewItem), true, true);
|
if (a_Player->GetInventory().AddItem(cItem(NewItem), true, true) != 1)
|
||||||
|
{
|
||||||
|
// The bucket didn't fit, toss it as a pickup:
|
||||||
|
a_Player->TossPickup(cItem(NewItem));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove water / lava block
|
|
||||||
a_Player->GetWorld()->SetBlock(BlockPos.x, BlockPos.y, BlockPos.z, E_BLOCK_AIR, 0);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PlaceFluid(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_FluidBlock)
|
|
||||||
|
bool PlaceFluid(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, BLOCKTYPE a_FluidBlock
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if (a_BlockFace != BLOCK_FACE_NONE)
|
if (a_BlockFace != BLOCK_FACE_NONE)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BLOCKTYPE CurrentBlock;
|
BLOCKTYPE CurrentBlockType;
|
||||||
|
NIBBLETYPE CurrentBlockMeta;
|
||||||
|
eBlockFace EntryFace;
|
||||||
Vector3i BlockPos;
|
Vector3i BlockPos;
|
||||||
if (!GetPlacementCoordsFromTrace(a_World, a_Player, BlockPos, CurrentBlock))
|
if (!GetPlacementCoordsFromTrace(a_World, a_Player, BlockPos, CurrentBlockType, CurrentBlockMeta, EntryFace))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -125,23 +144,29 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Wash away anything that was there prior to placing:
|
// Wash away anything that was there prior to placing:
|
||||||
if (cFluidSimulator::CanWashAway(CurrentBlock))
|
if (cFluidSimulator::CanWashAway(CurrentBlockType))
|
||||||
{
|
{
|
||||||
cBlockHandler * Handler = BlockHandler(CurrentBlock);
|
if (a_PluginInterface.CallHookPlayerBreakingBlock(*a_Player, BlockPos.x, BlockPos.y, BlockPos.z, EntryFace, CurrentBlockType, CurrentBlockMeta))
|
||||||
|
{
|
||||||
|
// Plugin disagrees with the washing-away
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cBlockHandler * Handler = BlockHandler(CurrentBlockType);
|
||||||
if (Handler->DoesDropOnUnsuitable())
|
if (Handler->DoesDropOnUnsuitable())
|
||||||
{
|
{
|
||||||
cChunkInterface ChunkInterface(a_World->GetChunkMap());
|
cChunkInterface ChunkInterface(a_World->GetChunkMap());
|
||||||
cBlockInServerPluginInterface PluginInterface(*a_World);
|
Handler->DropBlock(ChunkInterface, *a_World, a_PluginInterface, a_Player, BlockPos.x, BlockPos.y, BlockPos.z);
|
||||||
Handler->DropBlock(ChunkInterface, *a_World, PluginInterface, a_Player, a_BlockX, a_BlockY, a_BlockZ);
|
|
||||||
}
|
}
|
||||||
|
a_PluginInterface.CallHookPlayerBrokenBlock(*a_Player, BlockPos.x, BlockPos.y, BlockPos.z, EntryFace, CurrentBlockType, CurrentBlockMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
a_World->SetBlock(BlockPos.x, BlockPos.y, BlockPos.z, a_FluidBlock, 0);
|
// Place the actual fluid block:
|
||||||
|
return a_Player->PlaceBlock(BlockPos.x, BlockPos.y, BlockPos.z, a_FluidBlock, 0);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool GetBlockFromTrace(cWorld * a_World, cPlayer * a_Player, Vector3i & a_BlockPos)
|
bool GetBlockFromTrace(cWorld * a_World, cPlayer * a_Player, Vector3i & a_BlockPos)
|
||||||
{
|
{
|
||||||
class cCallbacks :
|
class cCallbacks :
|
||||||
@ -190,20 +215,25 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool GetPlacementCoordsFromTrace(cWorld * a_World, cPlayer * a_Player, Vector3i & a_BlockPos, BLOCKTYPE & a_BlockType)
|
|
||||||
|
bool GetPlacementCoordsFromTrace(cWorld * a_World, cPlayer * a_Player, Vector3i & a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta, eBlockFace & a_BlockFace)
|
||||||
{
|
{
|
||||||
class cCallbacks :
|
class cCallbacks :
|
||||||
public cBlockTracer::cCallbacks
|
public cBlockTracer::cCallbacks
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Vector3i m_Pos;
|
Vector3i m_Pos;
|
||||||
BLOCKTYPE m_ReplacedBlock;
|
BLOCKTYPE m_ReplacedBlockType;
|
||||||
|
NIBBLETYPE m_ReplacedBlockMeta;
|
||||||
|
eBlockFace m_EntryFace;
|
||||||
|
|
||||||
virtual bool OnNextBlock(int a_CBBlockX, int a_CBBlockY, int a_CBBlockZ, BLOCKTYPE a_CBBlockType, NIBBLETYPE a_CBBlockMeta, char a_CBEntryFace) override
|
virtual bool OnNextBlock(int a_CBBlockX, int a_CBBlockY, int a_CBBlockZ, BLOCKTYPE a_CBBlockType, NIBBLETYPE a_CBBlockMeta, char a_CBEntryFace) override
|
||||||
{
|
{
|
||||||
if (a_CBBlockType != E_BLOCK_AIR)
|
if (a_CBBlockType != E_BLOCK_AIR)
|
||||||
{
|
{
|
||||||
m_ReplacedBlock = a_CBBlockType;
|
m_ReplacedBlockType = a_CBBlockType;
|
||||||
|
m_ReplacedBlockMeta = a_CBBlockMeta;
|
||||||
|
m_EntryFace = static_cast<eBlockFace>(a_CBEntryFace);
|
||||||
if (!cFluidSimulator::CanWashAway(a_CBBlockType) && !IsBlockLiquid(a_CBBlockType))
|
if (!cFluidSimulator::CanWashAway(a_CBBlockType) && !IsBlockLiquid(a_CBBlockType))
|
||||||
{
|
{
|
||||||
AddFaceDirection(a_CBBlockX, a_CBBlockY, a_CBBlockZ, (eBlockFace)a_CBEntryFace); // Was an unwashawayable block, can't overwrite it!
|
AddFaceDirection(a_CBBlockX, a_CBBlockY, a_CBBlockZ, (eBlockFace)a_CBEntryFace); // Was an unwashawayable block, can't overwrite it!
|
||||||
@ -219,12 +249,14 @@ public:
|
|||||||
Vector3d Start(a_Player->GetEyePosition());
|
Vector3d Start(a_Player->GetEyePosition());
|
||||||
Vector3d End(a_Player->GetEyePosition() + a_Player->GetLookVector() * 5);
|
Vector3d End(a_Player->GetEyePosition() + a_Player->GetLookVector() * 5);
|
||||||
|
|
||||||
// cTracer::Trace returns true when whole line was traversed. By returning true when we hit something, we ensure that this never happens if liquid could be placed
|
// cTracer::Trace returns true when whole line was traversed. By returning true from the callback when we hit something, we ensure that this never happens if liquid could be placed
|
||||||
// Use this to judge whether the position is valid
|
// Use this to judge whether the position is valid
|
||||||
if (!Tracer.Trace(Start.x, Start.y, Start.z, End.x, End.y, End.z))
|
if (!Tracer.Trace(Start.x, Start.y, Start.z, End.x, End.y, End.z))
|
||||||
{
|
{
|
||||||
a_BlockPos = Callbacks.m_Pos;
|
a_BlockPos = Callbacks.m_Pos;
|
||||||
a_BlockType = Callbacks.m_ReplacedBlock;
|
a_BlockType = Callbacks.m_ReplacedBlockType;
|
||||||
|
a_BlockMeta = Callbacks.m_ReplacedBlockMeta;
|
||||||
|
a_BlockFace = Callbacks.m_EntryFace;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,12 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
// Handle growing the plants:
|
// Handle growing the plants:
|
||||||
if (a_Item.m_ItemDamage == E_META_DYE_WHITE)
|
if (a_Item.m_ItemDamage == E_META_DYE_WHITE)
|
||||||
|
@ -27,12 +27,17 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
UNUSED(a_Item);
|
UNUSED(a_Item);
|
||||||
UNUSED(a_BlockX);
|
UNUSED(a_BlockX);
|
||||||
UNUSED(a_BlockZ);
|
UNUSED(a_BlockZ);
|
||||||
UNUSED(a_Dir);
|
UNUSED(a_BlockFace);
|
||||||
|
|
||||||
// The map center is fixed at the central point of the 8x8 block of chunks you are standing in when you right-click it.
|
// The map center is fixed at the central point of the 8x8 block of chunks you are standing in when you right-click it.
|
||||||
|
|
||||||
@ -60,3 +65,7 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -93,9 +93,14 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if (a_Dir != BLOCK_FACE_NONE)
|
if (a_BlockFace != BLOCK_FACE_NONE)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -411,15 +411,19 @@ bool cItemHandler::OnPlayerPlace(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cItemHandler::OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir)
|
bool cItemHandler::OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNUSED(a_World);
|
UNUSED(a_World);
|
||||||
UNUSED(a_Player);
|
UNUSED(a_Player);
|
||||||
|
UNUSED(a_PluginInterface);
|
||||||
UNUSED(a_Item);
|
UNUSED(a_Item);
|
||||||
UNUSED(a_BlockX);
|
UNUSED(a_BlockX);
|
||||||
UNUSED(a_BlockY);
|
UNUSED(a_BlockY);
|
||||||
UNUSED(a_BlockZ);
|
UNUSED(a_BlockZ);
|
||||||
UNUSED(a_Dir);
|
UNUSED(a_BlockFace);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "../Defines.h"
|
#include "../Defines.h"
|
||||||
#include "../Item.h"
|
#include "../Item.h"
|
||||||
#include "../Entities/EntityEffect.h"
|
#include "../Entities/EntityEffect.h"
|
||||||
|
#include "../Blocks/BlockPluginInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -56,8 +57,12 @@ public:
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/** Called when the player tries to use the item (right mouse button). Return false to make the item unusable. DEFAULT: False */
|
/** Called when the player tries to use the item (right mouse button).
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir);
|
Return false to abort the usage. DEFAULT: False */
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
/** Called when the client sends the SHOOT status in the lclk packet */
|
/** Called when the client sends the SHOOT status in the lclk packet */
|
||||||
|
@ -18,9 +18,14 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld *a_World, cPlayer *a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if ((a_Dir == BLOCK_FACE_NONE) || (a_BlockY >= cChunkDef::Height))
|
if ((a_BlockFace == BLOCK_FACE_NONE) || (a_BlockY >= cChunkDef::Height))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -19,21 +19,26 @@ public:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld *a_World, cPlayer *a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if ((a_Dir == BLOCK_FACE_NONE) || (a_Dir == BLOCK_FACE_YP) || (a_Dir == BLOCK_FACE_YM))
|
if ((a_BlockFace == BLOCK_FACE_NONE) || (a_BlockFace == BLOCK_FACE_YP) || (a_BlockFace == BLOCK_FACE_YM))
|
||||||
{
|
{
|
||||||
// Client sends this if clicked on top or bottom face
|
// Client sends this if clicked on top or bottom face
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_Dir); // Make sure block that will be occupied is free
|
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace); // Make sure block that will be occupied is free
|
||||||
BLOCKTYPE Block = a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
BLOCKTYPE Block = a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
||||||
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_Dir, true); // We want the clicked block, so go back again
|
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, true); // We want the clicked block, so go back again
|
||||||
|
|
||||||
if (Block == E_BLOCK_AIR)
|
if (Block == E_BLOCK_AIR)
|
||||||
{
|
{
|
||||||
cItemFrame * ItemFrame = new cItemFrame(a_Dir, a_BlockX, a_BlockY, a_BlockZ);
|
cItemFrame * ItemFrame = new cItemFrame(a_BlockFace, a_BlockX, a_BlockY, a_BlockZ);
|
||||||
if (!ItemFrame->Initialize(*a_World))
|
if (!ItemFrame->Initialize(*a_World))
|
||||||
{
|
{
|
||||||
delete ItemFrame;
|
delete ItemFrame;
|
||||||
|
@ -19,7 +19,12 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if (a_BlockFace < 0)
|
if (a_BlockFace < 0)
|
||||||
{
|
{
|
||||||
|
@ -29,7 +29,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if (a_BlockFace > BLOCK_FACE_NONE)
|
if (a_BlockFace > BLOCK_FACE_NONE)
|
||||||
{
|
{
|
||||||
|
@ -27,9 +27,12 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if (a_Dir < 0)
|
if (a_BlockFace < 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -19,15 +19,20 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if ((a_Dir == BLOCK_FACE_NONE) || (a_Dir == BLOCK_FACE_YM) || (a_Dir == BLOCK_FACE_YP))
|
if ((a_BlockFace == BLOCK_FACE_NONE) || (a_BlockFace == BLOCK_FACE_YM) || (a_BlockFace == BLOCK_FACE_YP))
|
||||||
{
|
{
|
||||||
// Paintings can't be flatly placed
|
// Paintings can't be flatly placed
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_Dir); // Make sure block that will be occupied is free
|
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace); // Make sure block that will be occupied is free
|
||||||
BLOCKTYPE Block = a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
BLOCKTYPE Block = a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
||||||
|
|
||||||
if (Block == E_BLOCK_AIR)
|
if (Block == E_BLOCK_AIR)
|
||||||
@ -65,7 +70,7 @@ public:
|
|||||||
{ "BurningSkull" }
|
{ "BurningSkull" }
|
||||||
};
|
};
|
||||||
|
|
||||||
cPainting * Painting = new cPainting(gPaintingTitlesList[a_World->GetTickRandomNumber(ARRAYCOUNT(gPaintingTitlesList) - 1)].Title, a_Dir, a_BlockX, a_BlockY, a_BlockZ);
|
cPainting * Painting = new cPainting(gPaintingTitlesList[a_World->GetTickRandomNumber(ARRAYCOUNT(gPaintingTitlesList) - 1)].Title, a_BlockFace, a_BlockX, a_BlockY, a_BlockZ);
|
||||||
Painting->Initialize(*a_World);
|
Painting->Initialize(*a_World);
|
||||||
|
|
||||||
if (!a_Player->IsGameModeCreative())
|
if (!a_Player->IsGameModeCreative())
|
||||||
|
@ -26,7 +26,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
short PotionDamage = a_Item.m_ItemDamage;
|
short PotionDamage = a_Item.m_ItemDamage;
|
||||||
|
|
||||||
|
@ -19,7 +19,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if (a_BlockFace < 0)
|
if (a_BlockFace < 0)
|
||||||
{
|
{
|
||||||
|
@ -26,7 +26,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
Vector3d Pos = a_Player->GetThrowStartPos();
|
Vector3d Pos = a_Player->GetThrowStartPos();
|
||||||
Vector3d Speed = a_Player->GetLookVector() * m_SpeedCoeff;
|
Vector3d Speed = a_Player->GetLookVector() * m_SpeedCoeff;
|
||||||
@ -128,7 +132,12 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
|
||||||
|
|
||||||
|
virtual bool OnItemUse(
|
||||||
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
||||||
|
) override
|
||||||
{
|
{
|
||||||
if (a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ) == E_BLOCK_AIR)
|
if (a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ) == E_BLOCK_AIR)
|
||||||
{
|
{
|
||||||
@ -149,3 +158,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user