Merged branch 'master' into c++11.
This commit is contained in:
commit
f8c54f4243
|
@ -35,12 +35,49 @@ return
|
||||||
Inherits = "cProjectileEntity",
|
Inherits = "cProjectileEntity",
|
||||||
}, -- cArrowEntity
|
}, -- cArrowEntity
|
||||||
|
|
||||||
|
cExpBottleEntity =
|
||||||
|
{
|
||||||
|
Desc = [[
|
||||||
|
Represents a thrown ExpBottle. A subclass of the {{cProjectileEntity}}.
|
||||||
|
]],
|
||||||
|
Functions =
|
||||||
|
{
|
||||||
|
},
|
||||||
|
Inherits = "cProjectileEntity",
|
||||||
|
}, -- cExpBottleEntity
|
||||||
|
|
||||||
cFireChargeEntity =
|
cFireChargeEntity =
|
||||||
|
{
|
||||||
|
Desc = [[
|
||||||
|
Represents a fire charge that has been shot by a Blaze or a {{cDispenserEntity|Dispenser}}. A subclass
|
||||||
|
of the {{cProjectileEntity}}.
|
||||||
|
]],
|
||||||
|
Functions = {},
|
||||||
|
Inherits = "cProjectileEntity",
|
||||||
|
}, -- cFireChargeEntity
|
||||||
|
|
||||||
|
cFireworkEntity =
|
||||||
|
{
|
||||||
|
Desc = [[
|
||||||
|
Represents a firework rocket.
|
||||||
|
]],
|
||||||
|
Functions =
|
||||||
|
{
|
||||||
|
GetItem = { Params = "", Return = "{{cItem}}", Notes = "Returns the item that has been used to create the firework rocket. The item's m_FireworkItem member contains all the firework-related data." },
|
||||||
|
GetTicksToExplosion = { Params = "", Return = "number", Notes = "Returns the number of ticks left until the firework explodes." },
|
||||||
|
SetItem = { Params = "{{cItem}}", Return = "", Notes = "Sets a new item to be used for the firework." },
|
||||||
|
SetTicksToExplosion = { Params = "NumTicks", Return = "", Notes = "Sets the number of ticks left until the firework explodes." },
|
||||||
|
},
|
||||||
|
|
||||||
|
Inherits = "cProjectileEntity",
|
||||||
|
}, -- cFireworkEntity
|
||||||
|
|
||||||
|
cFloater =
|
||||||
{
|
{
|
||||||
Desc = "",
|
Desc = "",
|
||||||
Functions = {},
|
Functions = {},
|
||||||
Inherits = "cProjectileEntity",
|
Inherits = "cProjectileEntity",
|
||||||
}, -- cFireChargeEntity
|
}, -- cFloater
|
||||||
|
|
||||||
cGhastFireballEntity =
|
cGhastFireballEntity =
|
||||||
{
|
{
|
||||||
|
@ -64,14 +101,14 @@ return
|
||||||
pkArrow = { Notes = "The projectile is an {{cArrowEntity|arrow}}" },
|
pkArrow = { Notes = "The projectile is an {{cArrowEntity|arrow}}" },
|
||||||
pkEgg = { Notes = "The projectile is a {{cThrownEggEntity|thrown egg}}" },
|
pkEgg = { Notes = "The projectile is a {{cThrownEggEntity|thrown egg}}" },
|
||||||
pkEnderPearl = { Notes = "The projectile is a {{cThrownEnderPearlEntity|thrown enderpearl}}" },
|
pkEnderPearl = { Notes = "The projectile is a {{cThrownEnderPearlEntity|thrown enderpearl}}" },
|
||||||
pkExpBottle = { Notes = "The projectile is a thrown exp bottle (NYI)" },
|
pkExpBottle = { Notes = "The projectile is a {{cExpBottleEntity|thrown exp bottle}}" },
|
||||||
pkFireCharge = { Notes = "The projectile is a {{cFireChargeEntity|fire charge}}" },
|
pkFireCharge = { Notes = "The projectile is a {{cFireChargeEntity|fire charge}}" },
|
||||||
pkFirework = { Notes = "The projectile is a (flying) firework (NYI)" },
|
pkFirework = { Notes = "The projectile is a (flying) {{cFireworkEntity|firework}}" },
|
||||||
pkFishingFloat = { Notes = "The projectile is a fishing float (NYI)" },
|
pkFishingFloat = { Notes = "The projectile is a {{cFloater|fishing float}}" },
|
||||||
pkGhastFireball = { Notes = "The projectile is a {{cGhastFireballEntity|ghast fireball}}" },
|
pkGhastFireball = { Notes = "The projectile is a {{cGhastFireballEntity|ghast fireball}}" },
|
||||||
pkSnowball = { Notes = "The projectile is a {{cThrownSnowballEntity|thrown snowball}}" },
|
pkSnowball = { Notes = "The projectile is a {{cThrownSnowballEntity|thrown snowball}}" },
|
||||||
pkSplashPotion = { Notes = "The projectile is a thrown splash potion (NYI)" },
|
pkSplashPotion = { Notes = "The projectile is a {{cSplashPotionEntity|thrown splash potion}}" },
|
||||||
pkWitherSkull = { Notes = "The projectile is a wither skull (NYI)" },
|
pkWitherSkull = { Notes = "The projectile is a {{cWitherSkullEntity|wither skull}}" },
|
||||||
},
|
},
|
||||||
ConstantGroups =
|
ConstantGroups =
|
||||||
{
|
{
|
||||||
|
@ -84,6 +121,13 @@ return
|
||||||
Inherits = "cEntity",
|
Inherits = "cEntity",
|
||||||
}, -- cProjectileEntity
|
}, -- cProjectileEntity
|
||||||
|
|
||||||
|
cSplashPotionEntity =
|
||||||
|
{
|
||||||
|
Desc = "",
|
||||||
|
Functions = {},
|
||||||
|
Inherits = "cProjectileEntity",
|
||||||
|
}, -- cSplashPotionEntity
|
||||||
|
|
||||||
cThrownEggEntity =
|
cThrownEggEntity =
|
||||||
{
|
{
|
||||||
Desc = "",
|
Desc = "",
|
||||||
|
@ -97,13 +141,20 @@ return
|
||||||
Functions = {},
|
Functions = {},
|
||||||
Inherits = "cProjectileEntity",
|
Inherits = "cProjectileEntity",
|
||||||
}, -- cThrownEnderPearlEntity
|
}, -- cThrownEnderPearlEntity
|
||||||
|
|
||||||
cThrownSnowballEntity =
|
cThrownSnowballEntity =
|
||||||
{
|
{
|
||||||
Desc = "",
|
Desc = "",
|
||||||
Functions = {},
|
Functions = {},
|
||||||
Inherits = "cProjectileEntity",
|
Inherits = "cProjectileEntity",
|
||||||
}, -- cThrownSnowballEntity
|
}, -- cThrownSnowballEntity
|
||||||
|
|
||||||
|
cWitherSkullEntity =
|
||||||
|
{
|
||||||
|
Desc = "",
|
||||||
|
Functions = {},
|
||||||
|
Inherits = "cProjectileEntity",
|
||||||
|
}, -- cWitherSkullEntity
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit f8c2531fbef9bfd0b6f024d4d3319384a70a0831
|
Subproject commit 4702471943511f641458c7e8e89b430a723f43ea
|
|
@ -625,7 +625,11 @@ local function LoadPluginInfo(a_FolderName)
|
||||||
-- This is Lua-5.1-specific and won't work in Lua 5.2!
|
-- This is Lua-5.1-specific and won't work in Lua 5.2!
|
||||||
local Sandbox = {}
|
local Sandbox = {}
|
||||||
setfenv(cfg, Sandbox)
|
setfenv(cfg, Sandbox)
|
||||||
cfg()
|
local isSuccess, errMsg = pcall(cfg)
|
||||||
|
if not(isSuccess) then
|
||||||
|
return nil, "Cannot load Info.lua: " .. (errMsg or "<unknown error>")
|
||||||
|
end
|
||||||
|
|
||||||
if (Sandbox.g_PluginInfo == nil) then
|
if (Sandbox.g_PluginInfo == nil) then
|
||||||
return nil, "Info.lua doesn't contain the g_PluginInfo declaration"
|
return nil, "Info.lua doesn't contain the g_PluginInfo declaration"
|
||||||
end
|
end
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 7765048fa740b8f119db72a4ccc546504f86b2ab
|
Subproject commit 624580e5b522ba2799dfe5b5902b4002b1a8da3e
|
|
@ -33,7 +33,7 @@ function GetDefaultPage()
|
||||||
local AllPlugins = PM:GetAllPlugins()
|
local AllPlugins = PM:GetAllPlugins()
|
||||||
for key,value in pairs(AllPlugins) do
|
for key,value in pairs(AllPlugins) do
|
||||||
if( value ~= nil and value ~= false ) then
|
if( value ~= nil and value ~= false ) then
|
||||||
Content = Content .. "<li>" .. key .. " V." .. value:GetVersion() .. "</li>"
|
Content = Content .. "<li>" .. key .. " (version " .. value:GetVersion() .. ")</li>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -33,15 +33,27 @@ $cfile "../StringUtils.h"
|
||||||
$cfile "../Defines.h"
|
$cfile "../Defines.h"
|
||||||
$cfile "../ChatColor.h"
|
$cfile "../ChatColor.h"
|
||||||
$cfile "../ClientHandle.h"
|
$cfile "../ClientHandle.h"
|
||||||
|
$cfile "../Entities/ArrowEntity.h"
|
||||||
$cfile "../Entities/Entity.h"
|
$cfile "../Entities/Entity.h"
|
||||||
|
$cfile "../Entities/EntityEffect.h"
|
||||||
|
$cfile "../Entities/ExpBottleEntity.h"
|
||||||
|
$cfile "../Entities/FireChargeEntity.h"
|
||||||
|
$cfile "../Entities/FireworkEntity.h"
|
||||||
$cfile "../Entities/Floater.h"
|
$cfile "../Entities/Floater.h"
|
||||||
|
$cfile "../Entities/GhastFireballEntity.h"
|
||||||
|
$cfile "../Entities/HangingEntity.h"
|
||||||
|
$cfile "../Entities/ItemFrame.h"
|
||||||
$cfile "../Entities/Pawn.h"
|
$cfile "../Entities/Pawn.h"
|
||||||
$cfile "../Entities/Player.h"
|
$cfile "../Entities/Player.h"
|
||||||
$cfile "../Entities/Painting.h"
|
$cfile "../Entities/Painting.h"
|
||||||
$cfile "../Entities/Pickup.h"
|
$cfile "../Entities/Pickup.h"
|
||||||
$cfile "../Entities/ProjectileEntity.h"
|
$cfile "../Entities/ProjectileEntity.h"
|
||||||
|
$cfile "../Entities/SplashPotionEntity.h"
|
||||||
|
$cfile "../Entities/ThrownEggEntity.h"
|
||||||
|
$cfile "../Entities/ThrownEnderPearlEntity.h"
|
||||||
|
$cfile "../Entities/ThrownSnowballEntity.h"
|
||||||
$cfile "../Entities/TNTEntity.h"
|
$cfile "../Entities/TNTEntity.h"
|
||||||
$cfile "../Entities/EntityEffect.h"
|
$cfile "../Entities/WitherSkullEntity.h"
|
||||||
$cfile "../Server.h"
|
$cfile "../Server.h"
|
||||||
$cfile "../World.h"
|
$cfile "../World.h"
|
||||||
$cfile "../Inventory.h"
|
$cfile "../Inventory.h"
|
||||||
|
|
|
@ -5,131 +5,133 @@ include_directories ("${PROJECT_SOURCE_DIR}/../")
|
||||||
include_directories (".")
|
include_directories (".")
|
||||||
|
|
||||||
SET (SRCS
|
SET (SRCS
|
||||||
Bindings.cpp
|
Bindings.cpp
|
||||||
DeprecatedBindings.cpp
|
DeprecatedBindings.cpp
|
||||||
LuaChunkStay.cpp
|
LuaChunkStay.cpp
|
||||||
LuaState.cpp
|
LuaState.cpp
|
||||||
LuaWindow.cpp
|
LuaWindow.cpp
|
||||||
ManualBindings.cpp
|
ManualBindings.cpp
|
||||||
ManualBindings_RankManager.cpp
|
ManualBindings_RankManager.cpp
|
||||||
Plugin.cpp
|
Plugin.cpp
|
||||||
PluginLua.cpp
|
PluginLua.cpp
|
||||||
PluginManager.cpp
|
PluginManager.cpp
|
||||||
WebPlugin.cpp
|
WebPlugin.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
SET (HDRS
|
SET (HDRS
|
||||||
Bindings.h
|
Bindings.h
|
||||||
DeprecatedBindings.h
|
DeprecatedBindings.h
|
||||||
LuaChunkStay.h
|
LuaChunkStay.h
|
||||||
LuaFunctions.h
|
LuaFunctions.h
|
||||||
LuaState.h
|
LuaState.h
|
||||||
LuaWindow.h
|
LuaWindow.h
|
||||||
ManualBindings.h
|
ManualBindings.h
|
||||||
Plugin.h
|
Plugin.h
|
||||||
PluginLua.h
|
PluginLua.h
|
||||||
PluginManager.h
|
PluginManager.h
|
||||||
WebPlugin.h
|
WebPlugin.h
|
||||||
tolua++.h
|
tolua++.h
|
||||||
)
|
)
|
||||||
|
|
||||||
# List all the files that are generated as part of the Bindings build process
|
# List all the files that are generated as part of the Bindings build process
|
||||||
set (BINDING_OUTPUTS
|
set (BINDING_OUTPUTS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/Bindings.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings.h
|
${CMAKE_CURRENT_SOURCE_DIR}/Bindings.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(BINDING_DEPENDENCIES
|
set(BINDING_DEPENDENCIES
|
||||||
tolua
|
tolua
|
||||||
../Bindings/virtual_method_hooks.lua
|
../Bindings/virtual_method_hooks.lua
|
||||||
../Bindings/AllToLua.pkg
|
../Bindings/AllToLua.pkg
|
||||||
../Bindings/LuaFunctions.h
|
../Bindings/LuaFunctions.h
|
||||||
../Bindings/LuaWindow.h
|
../Bindings/LuaWindow.h
|
||||||
../Bindings/Plugin.h
|
../Bindings/Plugin.h
|
||||||
../Bindings/PluginLua.h
|
../Bindings/PluginLua.h
|
||||||
../Bindings/PluginManager.h
|
../Bindings/PluginManager.h
|
||||||
../Bindings/WebPlugin.h
|
../Bindings/WebPlugin.h
|
||||||
../BiomeDef.h
|
../BiomeDef.h
|
||||||
../BlockArea.h
|
../BlockArea.h
|
||||||
../BlockEntities/BeaconEntity.h
|
../BlockEntities/BeaconEntity.h
|
||||||
../BlockEntities/BlockEntity.h
|
../BlockEntities/BlockEntity.h
|
||||||
../BlockEntities/BlockEntityWithItems.h
|
../BlockEntities/BlockEntityWithItems.h
|
||||||
../BlockEntities/ChestEntity.h
|
../BlockEntities/ChestEntity.h
|
||||||
../BlockEntities/DispenserEntity.h
|
../BlockEntities/DispenserEntity.h
|
||||||
../BlockEntities/DropSpenserEntity.h
|
../BlockEntities/DropSpenserEntity.h
|
||||||
../BlockEntities/DropperEntity.h
|
../BlockEntities/DropperEntity.h
|
||||||
../BlockEntities/FurnaceEntity.h
|
../BlockEntities/FurnaceEntity.h
|
||||||
../BlockEntities/HopperEntity.h
|
../BlockEntities/HopperEntity.h
|
||||||
../BlockEntities/JukeboxEntity.h
|
../BlockEntities/JukeboxEntity.h
|
||||||
../BlockEntities/NoteEntity.h
|
../BlockEntities/NoteEntity.h
|
||||||
../BlockEntities/SignEntity.h
|
../BlockEntities/SignEntity.h
|
||||||
../BlockEntities/MobHeadEntity.h
|
../BlockEntities/MobHeadEntity.h
|
||||||
../BlockEntities/FlowerPotEntity.h
|
../BlockEntities/FlowerPotEntity.h
|
||||||
../BlockID.h
|
../BlockID.h
|
||||||
../BoundingBox.h
|
../BoundingBox.h
|
||||||
../ChatColor.h
|
../ChatColor.h
|
||||||
../ChunkDef.h
|
../ChunkDef.h
|
||||||
../ClientHandle.h
|
../ClientHandle.h
|
||||||
../CraftingRecipes.h
|
../CraftingRecipes.h
|
||||||
../Cuboid.h
|
../Cuboid.h
|
||||||
../Defines.h
|
../Defines.h
|
||||||
../Enchantments.h
|
../Enchantments.h
|
||||||
../Entities/EntityEffect.h
|
../Entities/ArrowEntity.h
|
||||||
../Entities/Entity.h
|
../Entities/Entity.h
|
||||||
../Entities/Floater.h
|
../Entities/EntityEffect.h
|
||||||
../Entities/Pawn.h
|
../Entities/ExpBottleEntity.h
|
||||||
../Entities/Painting.h
|
../Entities/FireChargeEntity.h
|
||||||
../Entities/Pickup.h
|
../Entities/FireworkEntity.h
|
||||||
../Entities/Player.h
|
../Entities/Floater.h
|
||||||
../Entities/ProjectileEntity.h
|
../Entities/GhastFireballEntity.h
|
||||||
../Entities/ArrowEntity.h
|
../Entities/HangingEntity.h
|
||||||
../Entities/ThrownEggEntity.h
|
../Entities/ItemFrame.h
|
||||||
../Entities/ThrownEnderPearlEntity.h
|
../Entities/Pawn.h
|
||||||
../Entities/ExpBottleEntity.h
|
../Entities/Player.h
|
||||||
../Entities/ThrownSnowballEntity.h
|
../Entities/Painting.h
|
||||||
../Entities/FireChargeEntity.h
|
../Entities/Pickup.h
|
||||||
../Entities/FireworkEntity.h
|
../Entities/ProjectileEntity.h
|
||||||
../Entities/GhastFireballEntity.h
|
../Entities/SplashPotionEntity.h
|
||||||
../Entities/TNTEntity.h
|
../Entities/ThrownEggEntity.h
|
||||||
../Entities/ExpOrb.h
|
../Entities/ThrownEnderPearlEntity.h
|
||||||
../Entities/HangingEntity.h
|
../Entities/ThrownSnowballEntity.h
|
||||||
../Entities/ItemFrame.h
|
../Entities/TNTEntity.h
|
||||||
../Generating/ChunkDesc.h
|
../Entities/WitherSkullEntity.h
|
||||||
../Inventory.h
|
../Generating/ChunkDesc.h
|
||||||
../Item.h
|
../Inventory.h
|
||||||
../ItemGrid.h
|
../Item.h
|
||||||
../Mobs/Monster.h
|
../ItemGrid.h
|
||||||
../OSSupport/File.h
|
../Mobs/Monster.h
|
||||||
../Root.h
|
../OSSupport/File.h
|
||||||
../Server.h
|
../Root.h
|
||||||
../StringUtils.h
|
../Server.h
|
||||||
../Tracer.h
|
../StringUtils.h
|
||||||
../UI/Window.h
|
../Tracer.h
|
||||||
../Vector3.h
|
../UI/Window.h
|
||||||
../WebAdmin.h
|
../Vector3.h
|
||||||
../World.h
|
../WebAdmin.h
|
||||||
|
../World.h
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
ADD_CUSTOM_COMMAND(
|
ADD_CUSTOM_COMMAND(
|
||||||
# add any new generated bindings here
|
# add any new generated bindings here
|
||||||
OUTPUT ${BINDING_OUTPUTS}
|
OUTPUT ${BINDING_OUTPUTS}
|
||||||
|
|
||||||
# Regenerate bindings:
|
# Regenerate bindings:
|
||||||
COMMAND tolua -L virtual_method_hooks.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg
|
COMMAND tolua -L virtual_method_hooks.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
|
||||||
# add any new generation dependencies here
|
# add any new generation dependencies here
|
||||||
DEPENDS ${BINDING_DEPENDENCIES}
|
DEPENDS ${BINDING_DEPENDENCIES}
|
||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES GENERATED TRUE)
|
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES GENERATED TRUE)
|
||||||
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.h PROPERTIES GENERATED TRUE)
|
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.h PROPERTIES GENERATED TRUE)
|
||||||
|
|
||||||
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES COMPILE_FLAGS -Wno-error)
|
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES COMPILE_FLAGS -Wno-error)
|
||||||
|
|
||||||
if(NOT MSVC)
|
if(NOT MSVC)
|
||||||
add_library(Bindings ${SRCS} ${HDRS})
|
add_library(Bindings ${SRCS} ${HDRS})
|
||||||
|
|
||||||
target_link_libraries(Bindings lua sqlite tolualib polarssl)
|
target_link_libraries(Bindings lua sqlite tolualib polarssl)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -562,16 +562,57 @@ void cLuaState::Push(cEntity * a_Entity)
|
||||||
{
|
{
|
||||||
lua_pushnil(m_LuaState);
|
lua_pushnil(m_LuaState);
|
||||||
}
|
}
|
||||||
else if (a_Entity->IsMob())
|
|
||||||
{
|
|
||||||
// Don't push specific mob types, as those are not exported in the API:
|
|
||||||
tolua_pushusertype(m_LuaState, a_Entity, "cMonster");
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Push the specific class type:
|
switch (a_Entity->GetEntityType())
|
||||||
tolua_pushusertype(m_LuaState, a_Entity, a_Entity->GetClass());
|
{
|
||||||
|
case cEntity::etMonster:
|
||||||
|
{
|
||||||
|
// Don't push specific mob types, as those are not exported in the API:
|
||||||
|
tolua_pushusertype(m_LuaState, a_Entity, "cMonster");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case cEntity::etPlayer:
|
||||||
|
{
|
||||||
|
tolua_pushusertype(m_LuaState, a_Entity, "cPlayer");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case cEntity::etPickup:
|
||||||
|
{
|
||||||
|
tolua_pushusertype(m_LuaState, a_Entity, "cPickup");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case cEntity::etTNT:
|
||||||
|
{
|
||||||
|
tolua_pushusertype(m_LuaState, a_Entity, "cTNTEntity");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case cEntity::etProjectile:
|
||||||
|
{
|
||||||
|
tolua_pushusertype(m_LuaState, a_Entity, a_Entity->GetClass());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case cEntity::etFloater:
|
||||||
|
{
|
||||||
|
tolua_pushusertype(m_LuaState, a_Entity, "cFloater");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case cEntity::etEntity:
|
||||||
|
case cEntity::etEnderCrystal:
|
||||||
|
case cEntity::etFallingBlock:
|
||||||
|
case cEntity::etMinecart:
|
||||||
|
case cEntity::etBoat:
|
||||||
|
case cEntity::etExpOrb:
|
||||||
|
case cEntity::etItemFrame:
|
||||||
|
case cEntity::etPainting:
|
||||||
|
{
|
||||||
|
// Push the generic entity class type:
|
||||||
|
tolua_pushusertype(m_LuaState, a_Entity, "cEntity");
|
||||||
|
}
|
||||||
|
} // switch (EntityType)
|
||||||
}
|
}
|
||||||
|
|
||||||
m_NumCurrentFunctionArgs += 1;
|
m_NumCurrentFunctionArgs += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,7 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)
|
||||||
{
|
{
|
||||||
double MobX = 0.5 + (DispX + DispChunk->GetPosX() * cChunkDef::Width);
|
double MobX = 0.5 + (DispX + DispChunk->GetPosX() * cChunkDef::Width);
|
||||||
double MobZ = 0.5 + (DispZ + DispChunk->GetPosZ() * cChunkDef::Width);
|
double MobZ = 0.5 + (DispZ + DispChunk->GetPosZ() * cChunkDef::Width);
|
||||||
if (m_World->SpawnMob(MobX, DispY, MobZ, (eMonsterType)m_Contents.GetSlot(a_SlotNum).m_ItemDamage) >= 0)
|
if (m_World->SpawnMob(MobX, DispY, MobZ, static_cast<eMonsterType>(m_Contents.GetSlot(a_SlotNum).m_ItemDamage)) >= 0)
|
||||||
{
|
{
|
||||||
m_Contents.ChangeSlotCount(a_SlotNum, -1);
|
m_Contents.ChangeSlotCount(a_SlotNum, -1);
|
||||||
}
|
}
|
||||||
|
@ -190,7 +190,7 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)
|
||||||
|
|
||||||
void cDispenserEntity::SpawnProjectileFromDispenser(int a_BlockX, int a_BlockY, int a_BlockZ, cProjectileEntity::eKind a_Kind, const Vector3d & a_ShootVector)
|
void cDispenserEntity::SpawnProjectileFromDispenser(int a_BlockX, int a_BlockY, int a_BlockZ, cProjectileEntity::eKind a_Kind, const Vector3d & a_ShootVector)
|
||||||
{
|
{
|
||||||
m_World->CreateProjectile((double)a_BlockX + 0.5, (double)a_BlockY + 0.5, (double)a_BlockZ + 0.5, a_Kind, nullptr, nullptr, &a_ShootVector);
|
m_World->CreateProjectile(static_cast<double>(a_BlockX + 0.5), static_cast<double>(a_BlockY + 0.5), static_cast<double>(a_BlockZ + 0.5), a_Kind, nullptr, nullptr, &a_ShootVector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -275,6 +275,3 @@ bool cDispenserEntity::EmptyLiquidBucket(BLOCKTYPE a_BlockInFront, int a_SlotNum
|
||||||
m_Contents.AddItem(EmptyBucket);
|
m_Contents.AddItem(EmptyBucket);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ void cFlowerPotEntity::UsedBy(cPlayer * a_Player)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cItem SelectedItem = a_Player->GetInventory().GetEquippedItem();
|
cItem SelectedItem = a_Player->GetInventory().GetEquippedItem();
|
||||||
if (IsFlower(SelectedItem.m_ItemType, SelectedItem.m_ItemDamage))
|
if (IsFlower(SelectedItem.m_ItemType, SelectedItem.m_ItemDamage))
|
||||||
{
|
{
|
||||||
|
@ -63,7 +63,7 @@ void cFlowerPotEntity::Destroy(void)
|
||||||
cItems Pickups;
|
cItems Pickups;
|
||||||
Pickups.Add(m_Item);
|
Pickups.Add(m_Item);
|
||||||
m_World->SpawnItemPickups(Pickups, m_PosX + 0.5, m_PosY + 0.5, m_PosZ + 0.5);
|
m_World->SpawnItemPickups(Pickups, m_PosX + 0.5, m_PosY + 0.5, m_PosZ + 0.5);
|
||||||
|
|
||||||
m_Item.Empty();
|
m_Item.Empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ bool cFlowerPotEntity::IsFlower(short m_ItemType, short m_ItemData)
|
||||||
}
|
}
|
||||||
case E_BLOCK_TALL_GRASS:
|
case E_BLOCK_TALL_GRASS:
|
||||||
{
|
{
|
||||||
return (m_ItemData == (short) 2);
|
return (m_ItemData == static_cast<short>(2));
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
@ -96,7 +96,3 @@ bool cFlowerPotEntity::IsFlower(short m_ItemType, short m_ItemData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -115,16 +115,16 @@ bool cFurnaceEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
||||||
FinishOne();
|
FinishOne();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_TimeBurned++;
|
m_TimeBurned++;
|
||||||
if (m_TimeBurned >= m_FuelBurnTime)
|
if (m_TimeBurned >= m_FuelBurnTime)
|
||||||
{
|
{
|
||||||
// The current fuel has been exhausted, use another one, if possible
|
// The current fuel has been exhausted, use another one, if possible
|
||||||
BurnNewFuel();
|
BurnNewFuel();
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateProgressBars();
|
UpdateProgressBars();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ void cFurnaceEntity::BurnNewFuel(void)
|
||||||
SetIsCooking(false);
|
SetIsCooking(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is the input and output ready for cooking?
|
// Is the input and output ready for cooking?
|
||||||
if (!CanCookInputToOutput())
|
if (!CanCookInputToOutput())
|
||||||
{
|
{
|
||||||
|
@ -217,12 +217,12 @@ void cFurnaceEntity::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(a_ItemGrid == &m_Contents);
|
ASSERT(a_ItemGrid == &m_Contents);
|
||||||
switch (a_SlotNum)
|
switch (a_SlotNum)
|
||||||
{
|
{
|
||||||
case fsInput: UpdateInput(); break;
|
case fsInput: UpdateInput(); break;
|
||||||
case fsFuel: UpdateFuel(); break;
|
case fsFuel: UpdateFuel(); break;
|
||||||
case fsOutput: UpdateOutput(); break;
|
case fsOutput: UpdateOutput(); break;
|
||||||
default: ASSERT(!"Invalid furnace slot update!"); break;
|
default: ASSERT(!"Invalid furnace slot update!"); break;
|
||||||
}
|
}
|
||||||
|
@ -241,7 +241,7 @@ void cFurnaceEntity::UpdateInput(void)
|
||||||
m_TimeCooked = 0;
|
m_TimeCooked = 0;
|
||||||
}
|
}
|
||||||
m_LastInput = m_Contents.GetSlot(fsInput);
|
m_LastInput = m_Contents.GetSlot(fsInput);
|
||||||
|
|
||||||
cFurnaceRecipe * FR = cRoot::Get()->GetFurnaceRecipe();
|
cFurnaceRecipe * FR = cRoot::Get()->GetFurnaceRecipe();
|
||||||
m_CurrentRecipe = FR->GetRecipeFrom(m_Contents.GetSlot(fsInput));
|
m_CurrentRecipe = FR->GetRecipeFrom(m_Contents.GetSlot(fsInput));
|
||||||
if (!CanCookInputToOutput())
|
if (!CanCookInputToOutput())
|
||||||
|
@ -254,7 +254,7 @@ void cFurnaceEntity::UpdateInput(void)
|
||||||
{
|
{
|
||||||
m_NeedCookTime = m_CurrentRecipe->CookTime;
|
m_NeedCookTime = m_CurrentRecipe->CookTime;
|
||||||
SetIsCooking(true);
|
SetIsCooking(true);
|
||||||
|
|
||||||
// Start burning new fuel if there's no flame now:
|
// Start burning new fuel if there's no flame now:
|
||||||
if (GetFuelBurnTimeLeft() <= 0)
|
if (GetFuelBurnTimeLeft() <= 0)
|
||||||
{
|
{
|
||||||
|
@ -274,7 +274,7 @@ void cFurnaceEntity::UpdateFuel(void)
|
||||||
// The current fuel is still burning, don't modify anything:
|
// The current fuel is still burning, don't modify anything:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The current fuel is spent, try to burn some more:
|
// The current fuel is spent, try to burn some more:
|
||||||
BurnNewFuel();
|
BurnNewFuel();
|
||||||
}
|
}
|
||||||
|
@ -292,7 +292,7 @@ void cFurnaceEntity::UpdateOutput(void)
|
||||||
SetIsCooking(false);
|
SetIsCooking(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// No need to burn new fuel, the Tick() function will take care of that
|
// No need to burn new fuel, the Tick() function will take care of that
|
||||||
|
|
||||||
// Can cook, start cooking if not already underway:
|
// Can cook, start cooking if not already underway:
|
||||||
|
@ -311,7 +311,7 @@ bool cFurnaceEntity::CanCookInputToOutput(void) const
|
||||||
// This input cannot be cooked
|
// This input cannot be cooked
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const cItem & Slot = m_Contents.GetSlot(fsOutput);
|
const cItem & Slot = m_Contents.GetSlot(fsOutput);
|
||||||
if (Slot.IsEmpty())
|
if (Slot.IsEmpty())
|
||||||
{
|
{
|
||||||
|
@ -324,13 +324,13 @@ bool cFurnaceEntity::CanCookInputToOutput(void) const
|
||||||
// The output slot is blocked with something that cannot be stacked with the recipe's output
|
// The output slot is blocked with something that cannot be stacked with the recipe's output
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Slot.IsFullStack())
|
if (Slot.IsFullStack())
|
||||||
{
|
{
|
||||||
// Cannot add any more items to the output slot
|
// Cannot add any more items to the output slot
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,11 +345,11 @@ void cFurnaceEntity::UpdateProgressBars(bool a_ForceUpdate)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CurFuel = (m_FuelBurnTime > 0) ? 200 - (200 * m_TimeBurned / m_FuelBurnTime) : 0;
|
int CurFuel = (m_FuelBurnTime > 0) ? 200 - (200 * m_TimeBurned / m_FuelBurnTime) : 0;
|
||||||
BroadcastProgress(PROGRESSBAR_FUEL, static_cast<short>(CurFuel));
|
BroadcastProgress(PROGRESSBAR_FUEL, static_cast<short>(CurFuel));
|
||||||
|
|
||||||
int CurCook = (m_NeedCookTime > 0) ? (200 * m_TimeCooked / m_NeedCookTime) : 0;
|
int CurCook = (m_NeedCookTime > 0) ? (200 * m_TimeCooked / m_NeedCookTime) : 0;
|
||||||
BroadcastProgress(PROGRESSBAR_SMELTING_CONFIRM, 200); // Post 1.8, Mojang requires a random packet with an ID of three and value of 200. Wat. Wat. Wat.
|
BroadcastProgress(PROGRESSBAR_SMELTING_CONFIRM, 200); // Post 1.8, Mojang requires a random packet with an ID of three and value of 200. Wat. Wat. Wat.
|
||||||
BroadcastProgress(PROGRESSBAR_SMELTING, static_cast<short>(CurCook));
|
BroadcastProgress(PROGRESSBAR_SMELTING, static_cast<short>(CurCook));
|
||||||
}
|
}
|
||||||
|
@ -373,7 +373,3 @@ void cFurnaceEntity::SetIsCooking(bool a_IsCooking)
|
||||||
m_World->FastSetBlock(m_PosX, m_PosY, m_PosZ, E_BLOCK_LIT_FURNACE, m_BlockMeta);
|
m_World->FastSetBlock(m_PosX, m_PosY, m_PosZ, E_BLOCK_LIT_FURNACE, m_BlockMeta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -133,7 +133,7 @@ protected:
|
||||||
int m_FuelBurnTime;
|
int m_FuelBurnTime;
|
||||||
|
|
||||||
/** Amount of ticks that the current fuel has been burning */
|
/** Amount of ticks that the current fuel has been burning */
|
||||||
int m_TimeBurned;
|
int m_TimeBurned;
|
||||||
|
|
||||||
/** Sends the specified progressbar value to all clients of the window */
|
/** Sends the specified progressbar value to all clients of the window */
|
||||||
void BroadcastProgress(short a_ProgressbarID, short a_Value);
|
void BroadcastProgress(short a_ProgressbarID, short a_Value);
|
||||||
|
|
|
@ -58,7 +58,7 @@ bool cHopperEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
||||||
{
|
{
|
||||||
UNUSED(a_Dt);
|
UNUSED(a_Dt);
|
||||||
Int64 CurrentTick = a_Chunk.GetWorld()->GetWorldAge();
|
Int64 CurrentTick = a_Chunk.GetWorld()->GetWorldAge();
|
||||||
|
|
||||||
bool res = false;
|
bool res = false;
|
||||||
res = MoveItemsIn (a_Chunk, CurrentTick) || res;
|
res = MoveItemsIn (a_Chunk, CurrentTick) || res;
|
||||||
res = MovePickupsIn(a_Chunk, CurrentTick) || res;
|
res = MovePickupsIn(a_Chunk, CurrentTick) || res;
|
||||||
|
@ -74,7 +74,7 @@ void cHopperEntity::SendTo(cClientHandle & a_Client)
|
||||||
{
|
{
|
||||||
// The hopper entity doesn't need anything sent to the client when it's created / gets in the viewdistance
|
// The hopper entity doesn't need anything sent to the client when it's created / gets in the viewdistance
|
||||||
// All the actual handling is in the cWindow UI code that gets called when the hopper is rclked
|
// All the actual handling is in the cWindow UI code that gets called when the hopper is rclked
|
||||||
|
|
||||||
UNUSED(a_Client);
|
UNUSED(a_Client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ void cHopperEntity::UsedBy(cPlayer * a_Player)
|
||||||
OpenNewWindow();
|
OpenNewWindow();
|
||||||
Window = GetWindow();
|
Window = GetWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open the window for the player:
|
// Open the window for the player:
|
||||||
if (Window != nullptr)
|
if (Window != nullptr)
|
||||||
{
|
{
|
||||||
|
@ -138,7 +138,7 @@ bool cHopperEntity::MoveItemsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
// Too early after the previous transfer
|
// Too early after the previous transfer
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try moving an item in:
|
// Try moving an item in:
|
||||||
bool res = false;
|
bool res = false;
|
||||||
switch (a_Chunk.GetBlock(m_RelX, m_PosY + 1, m_RelZ))
|
switch (a_Chunk.GetBlock(m_RelX, m_PosY + 1, m_RelZ))
|
||||||
|
@ -161,17 +161,17 @@ bool cHopperEntity::MoveItemsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
case E_BLOCK_DROPPER:
|
case E_BLOCK_DROPPER:
|
||||||
case E_BLOCK_HOPPER:
|
case E_BLOCK_HOPPER:
|
||||||
{
|
{
|
||||||
res = MoveItemsFromGrid(*(cBlockEntityWithItems *)a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ));
|
res = MoveItemsFromGrid(*static_cast<cBlockEntityWithItems *>(a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the item has been moved, reset the last tick:
|
// If the item has been moved, reset the last tick:
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
m_LastMoveItemsInTick = a_CurrentTick;
|
m_LastMoveItemsInTick = a_CurrentTick;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,12 +205,12 @@ bool cHopperEntity::MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3f EntityPos = a_Entity->GetPosition();
|
Vector3f EntityPos = a_Entity->GetPosition();
|
||||||
Vector3f BlockPos(m_Pos.x + 0.5f, (float)m_Pos.y + 1, m_Pos.z + 0.5f); // One block above hopper, and search from center outwards
|
Vector3f BlockPos(m_Pos.x + 0.5f, static_cast<float>(m_Pos.y) + 1, m_Pos.z + 0.5f); // One block above hopper, and search from center outwards
|
||||||
double Distance = (EntityPos - BlockPos).Length();
|
double Distance = (EntityPos - BlockPos).Length();
|
||||||
|
|
||||||
if (Distance < 0.5)
|
if (Distance < 0.5)
|
||||||
{
|
{
|
||||||
if (TrySuckPickupIn((cPickup *)a_Entity))
|
if (TrySuckPickupIn(static_cast<cPickup *>(a_Entity)))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -238,9 +238,9 @@ bool cHopperEntity::MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
m_bFoundPickupsAbove = true;
|
m_bFoundPickupsAbove = true;
|
||||||
|
|
||||||
int PreviousCount = m_Contents.GetSlot(i).m_ItemCount;
|
int PreviousCount = m_Contents.GetSlot(i).m_ItemCount;
|
||||||
|
|
||||||
Item.m_ItemCount -= m_Contents.ChangeSlotCount(i, Item.m_ItemCount) - PreviousCount; // Set count to however many items were added
|
Item.m_ItemCount -= m_Contents.ChangeSlotCount(i, Item.m_ItemCount) - PreviousCount; // Set count to however many items were added
|
||||||
|
|
||||||
if (Item.IsEmpty())
|
if (Item.IsEmpty())
|
||||||
{
|
{
|
||||||
a_Pickup->Destroy(); // Kill pickup if all items were added
|
a_Pickup->Destroy(); // Kill pickup if all items were added
|
||||||
|
@ -280,7 +280,7 @@ bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
// Too early after the previous transfer
|
// Too early after the previous transfer
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the coords of the block where to output items:
|
// Get the coords of the block where to output items:
|
||||||
int OutX, OutY, OutZ;
|
int OutX, OutY, OutZ;
|
||||||
NIBBLETYPE Meta = a_Chunk.GetMeta(m_RelX, m_PosY, m_RelZ);
|
NIBBLETYPE Meta = a_Chunk.GetMeta(m_RelX, m_PosY, m_RelZ);
|
||||||
|
@ -294,7 +294,7 @@ bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
// Cannot output below the zero-th block level
|
// Cannot output below the zero-th block level
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert coords to relative:
|
// Convert coords to relative:
|
||||||
int OutRelX = OutX - a_Chunk.GetPosX() * cChunkDef::Width;
|
int OutRelX = OutX - a_Chunk.GetPosX() * cChunkDef::Width;
|
||||||
int OutRelZ = OutZ - a_Chunk.GetPosZ() * cChunkDef::Width;
|
int OutRelZ = OutZ - a_Chunk.GetPosZ() * cChunkDef::Width;
|
||||||
|
@ -304,7 +304,7 @@ bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
// The destination chunk has been unloaded, don't tick
|
// The destination chunk has been unloaded, don't tick
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call proper moving function, based on the blocktype present at the coords:
|
// Call proper moving function, based on the blocktype present at the coords:
|
||||||
bool res = false;
|
bool res = false;
|
||||||
switch (DestChunk->GetBlock(OutRelX, OutY, OutRelZ))
|
switch (DestChunk->GetBlock(OutRelX, OutY, OutRelZ))
|
||||||
|
@ -327,7 +327,7 @@ bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
case E_BLOCK_DROPPER:
|
case E_BLOCK_DROPPER:
|
||||||
case E_BLOCK_HOPPER:
|
case E_BLOCK_HOPPER:
|
||||||
{
|
{
|
||||||
cBlockEntityWithItems * BlockEntity = (cBlockEntityWithItems *)DestChunk->GetBlockEntity(OutX, OutY, OutZ);
|
cBlockEntityWithItems * BlockEntity = static_cast<cBlockEntityWithItems *>(DestChunk->GetBlockEntity(OutX, OutY, OutZ));
|
||||||
if (BlockEntity == nullptr)
|
if (BlockEntity == nullptr)
|
||||||
{
|
{
|
||||||
LOGWARNING("%s: A block entity was not found where expected at {%d, %d, %d}", __FUNCTION__, OutX, OutY, OutZ);
|
LOGWARNING("%s: A block entity was not found where expected at {%d, %d, %d}", __FUNCTION__, OutX, OutY, OutZ);
|
||||||
|
@ -337,13 +337,13 @@ bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the item has been moved, reset the last tick:
|
// If the item has been moved, reset the last tick:
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
m_LastMoveItemsOutTick = a_CurrentTick;
|
m_LastMoveItemsOutTick = a_CurrentTick;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,7 +354,7 @@ bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
/// Moves items from a chest (dblchest) above the hopper into this hopper. Returns true if contents have changed.
|
/// Moves items from a chest (dblchest) above the hopper into this hopper. Returns true if contents have changed.
|
||||||
bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
||||||
{
|
{
|
||||||
cChestEntity * MainChest = (cChestEntity *)a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ);
|
cChestEntity * MainChest = static_cast<cChestEntity *>(a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ));
|
||||||
if (MainChest == nullptr)
|
if (MainChest == nullptr)
|
||||||
{
|
{
|
||||||
LOGWARNING("%s: A chest entity was not found where expected, at {%d, %d, %d}", __FUNCTION__, m_PosX, m_PosY + 1, m_PosZ);
|
LOGWARNING("%s: A chest entity was not found where expected, at {%d, %d, %d}", __FUNCTION__, m_PosX, m_PosY + 1, m_PosZ);
|
||||||
|
@ -365,7 +365,7 @@ bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
||||||
// Moved the item from the chest directly above the hopper
|
// Moved the item from the chest directly above the hopper
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the chest is a double-chest (chest directly above was empty), if so, try to move from there:
|
// Check if the chest is a double-chest (chest directly above was empty), if so, try to move from there:
|
||||||
static const struct
|
static const struct
|
||||||
{
|
{
|
||||||
|
@ -395,7 +395,7 @@ bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
cChestEntity * SideChest = (cChestEntity *)Neighbor->GetBlockEntity(m_PosX + Coords[i].x, m_PosY + 1, m_PosZ + Coords[i].z);
|
cChestEntity * SideChest = static_cast<cChestEntity *>(Neighbor->GetBlockEntity(m_PosX + Coords[i].x, m_PosY + 1, m_PosZ + Coords[i].z));
|
||||||
if (SideChest == nullptr)
|
if (SideChest == nullptr)
|
||||||
{
|
{
|
||||||
LOGWARNING("%s: A chest entity was not found where expected, at {%d, %d, %d}", __FUNCTION__, m_PosX + Coords[i].x, m_PosY + 1, m_PosZ + Coords[i].z);
|
LOGWARNING("%s: A chest entity was not found where expected, at {%d, %d, %d}", __FUNCTION__, m_PosX + Coords[i].x, m_PosY + 1, m_PosZ + Coords[i].z);
|
||||||
|
@ -409,7 +409,7 @@ bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The chest was single and nothing could be moved
|
// The chest was single and nothing could be moved
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -421,13 +421,13 @@ bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
||||||
/// Moves items from a furnace above the hopper into this hopper. Returns true if contents have changed.
|
/// Moves items from a furnace above the hopper into this hopper. Returns true if contents have changed.
|
||||||
bool cHopperEntity::MoveItemsFromFurnace(cChunk & a_Chunk)
|
bool cHopperEntity::MoveItemsFromFurnace(cChunk & a_Chunk)
|
||||||
{
|
{
|
||||||
cFurnaceEntity * Furnace = (cFurnaceEntity *)a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ);
|
cFurnaceEntity * Furnace = static_cast<cFurnaceEntity *>(a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ));
|
||||||
if (Furnace == nullptr)
|
if (Furnace == nullptr)
|
||||||
{
|
{
|
||||||
LOGWARNING("%s: A furnace entity was not found where expected, at {%d, %d, %d}", __FUNCTION__, m_PosX, m_PosY + 1, m_PosZ);
|
LOGWARNING("%s: A furnace entity was not found where expected, at {%d, %d, %d}", __FUNCTION__, m_PosX, m_PosY + 1, m_PosZ);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try move from the output slot:
|
// Try move from the output slot:
|
||||||
if (MoveItemsFromSlot(*Furnace, cFurnaceEntity::fsOutput, true))
|
if (MoveItemsFromSlot(*Furnace, cFurnaceEntity::fsOutput, true))
|
||||||
{
|
{
|
||||||
|
@ -435,7 +435,7 @@ bool cHopperEntity::MoveItemsFromFurnace(cChunk & a_Chunk)
|
||||||
Furnace->SetOutputSlot(NewOutput.AddCount(-1));
|
Furnace->SetOutputSlot(NewOutput.AddCount(-1));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// No output moved, check if we can move an empty bucket out of the fuel slot:
|
// No output moved, check if we can move an empty bucket out of the fuel slot:
|
||||||
if (Furnace->GetFuelSlot().m_ItemType == E_ITEM_BUCKET)
|
if (Furnace->GetFuelSlot().m_ItemType == E_ITEM_BUCKET)
|
||||||
{
|
{
|
||||||
|
@ -445,7 +445,7 @@ bool cHopperEntity::MoveItemsFromFurnace(cChunk & a_Chunk)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nothing can be moved
|
// Nothing can be moved
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -458,7 +458,7 @@ bool cHopperEntity::MoveItemsFromGrid(cBlockEntityWithItems & a_Entity)
|
||||||
{
|
{
|
||||||
cItemGrid & Grid = a_Entity.GetContents();
|
cItemGrid & Grid = a_Entity.GetContents();
|
||||||
int NumSlots = Grid.GetNumSlots();
|
int NumSlots = Grid.GetNumSlots();
|
||||||
|
|
||||||
// First try adding items of types already in the hopper:
|
// First try adding items of types already in the hopper:
|
||||||
for (int i = 0; i < NumSlots; i++)
|
for (int i = 0; i < NumSlots; i++)
|
||||||
{
|
{
|
||||||
|
@ -519,7 +519,7 @@ bool cHopperEntity::MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_Sl
|
||||||
// Plugin disagrees with the move
|
// Plugin disagrees with the move
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Contents.ChangeSlotCount(i, 1);
|
m_Contents.ChangeSlotCount(i, 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -535,7 +535,7 @@ bool cHopperEntity::MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_Sl
|
||||||
bool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ)
|
bool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||||
{
|
{
|
||||||
// Try the chest directly connected to the hopper:
|
// Try the chest directly connected to the hopper:
|
||||||
cChestEntity * ConnectedChest = (cChestEntity *)a_Chunk.GetBlockEntity(a_BlockX, a_BlockY, a_BlockZ);
|
cChestEntity * ConnectedChest = static_cast<cChestEntity *>(a_Chunk.GetBlockEntity(a_BlockX, a_BlockY, a_BlockZ));
|
||||||
if (ConnectedChest == nullptr)
|
if (ConnectedChest == nullptr)
|
||||||
{
|
{
|
||||||
LOGWARNING("%s: A chest entity was not found where expected, at {%d, %d, %d}", __FUNCTION__, a_BlockX, a_BlockY, a_BlockZ);
|
LOGWARNING("%s: A chest entity was not found where expected, at {%d, %d, %d}", __FUNCTION__, a_BlockX, a_BlockY, a_BlockZ);
|
||||||
|
@ -578,7 +578,7 @@ bool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_Block
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
cChestEntity * Chest = (cChestEntity *)Neighbor->GetBlockEntity(a_BlockX + Coords[i].x, a_BlockY, a_BlockZ + Coords[i].z);
|
cChestEntity * Chest = static_cast<cChestEntity *>(Neighbor->GetBlockEntity(a_BlockX + Coords[i].x, a_BlockY, a_BlockZ + Coords[i].z));
|
||||||
if (Chest == nullptr)
|
if (Chest == nullptr)
|
||||||
{
|
{
|
||||||
LOGWARNING("%s: A chest entity was not found where expected, at {%d, %d, %d} (%d, %d)", __FUNCTION__, a_BlockX + Coords[i].x, a_BlockY, a_BlockZ + Coords[i].z, x, z);
|
LOGWARNING("%s: A chest entity was not found where expected, at {%d, %d, %d} (%d, %d)", __FUNCTION__, a_BlockX + Coords[i].x, a_BlockY, a_BlockZ + Coords[i].z, x, z);
|
||||||
|
@ -590,7 +590,7 @@ bool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_Block
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The chest was single and nothing could be moved
|
// The chest was single and nothing could be moved
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -602,7 +602,7 @@ bool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_Block
|
||||||
/// Moves items to the furnace at the specified coords. Returns true if contents have changed
|
/// Moves items to the furnace at the specified coords. Returns true if contents have changed
|
||||||
bool cHopperEntity::MoveItemsToFurnace(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_HopperMeta)
|
bool cHopperEntity::MoveItemsToFurnace(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_HopperMeta)
|
||||||
{
|
{
|
||||||
cFurnaceEntity * Furnace = (cFurnaceEntity *)a_Chunk.GetBlockEntity(a_BlockX, a_BlockY, a_BlockZ);
|
cFurnaceEntity * Furnace = static_cast<cFurnaceEntity *>(a_Chunk.GetBlockEntity(a_BlockX, a_BlockY, a_BlockZ));
|
||||||
if (a_HopperMeta == E_META_HOPPER_FACING_YM)
|
if (a_HopperMeta == E_META_HOPPER_FACING_YM)
|
||||||
{
|
{
|
||||||
// Feed the input slot of the furnace
|
// Feed the input slot of the furnace
|
||||||
|
@ -684,7 +684,3 @@ bool cHopperEntity::MoveItemsToSlot(cBlockEntityWithItems & a_Entity, int a_DstS
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ bool cJukeboxEntity::EjectRecord(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
cItems Drops;
|
cItems Drops;
|
||||||
Drops.push_back(cItem(m_Record, 1, 0));
|
Drops.push_back(cItem(static_cast<short>(m_Record), 1, 0));
|
||||||
m_Record = 0;
|
m_Record = 0;
|
||||||
m_World->SpawnItemPickups(Drops, m_PosX + 0.5, m_PosY + 1, m_PosZ + 0.5, 8);
|
m_World->SpawnItemPickups(Drops, m_PosX + 0.5, m_PosY + 1, m_PosZ + 0.5, 8);
|
||||||
m_World->BroadcastSoundParticleEffect(1005, m_PosX, m_PosY, m_PosZ, 0);
|
m_World->BroadcastSoundParticleEffect(1005, m_PosX, m_PosY, m_PosZ, 0);
|
||||||
|
@ -113,7 +113,3 @@ void cJukeboxEntity::SetRecord(int a_Record)
|
||||||
{
|
{
|
||||||
m_Record = a_Record;
|
m_Record = a_Record;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ void cSignEntity::SetLines(const AString & a_Line1, const AString & a_Line2, con
|
||||||
|
|
||||||
void cSignEntity::SetLine(int a_Index, const AString & a_Line)
|
void cSignEntity::SetLine(int a_Index, const AString & a_Line)
|
||||||
{
|
{
|
||||||
if ((a_Index < 0) || (a_Index >= (int)ARRAYCOUNT(m_Line)))
|
if ((a_Index < 0) || (a_Index >= static_cast<int>(ARRAYCOUNT(m_Line))))
|
||||||
{
|
{
|
||||||
LOGWARNING("%s: setting a non-existent line %d (value \"%s\"", __FUNCTION__, a_Index, a_Line.c_str());
|
LOGWARNING("%s: setting a non-existent line %d (value \"%s\"", __FUNCTION__, a_Index, a_Line.c_str());
|
||||||
return;
|
return;
|
||||||
|
@ -59,7 +59,7 @@ void cSignEntity::SetLine(int a_Index, const AString & a_Line)
|
||||||
|
|
||||||
AString cSignEntity::GetLine(int a_Index) const
|
AString cSignEntity::GetLine(int a_Index) const
|
||||||
{
|
{
|
||||||
if ((a_Index < 0) || (a_Index >= (int)ARRAYCOUNT(m_Line)))
|
if ((a_Index < 0) || (a_Index >= static_cast<int>(ARRAYCOUNT(m_Line))))
|
||||||
{
|
{
|
||||||
LOGWARNING("%s: requesting a non-existent line %d", __FUNCTION__, a_Index);
|
LOGWARNING("%s: requesting a non-existent line %d", __FUNCTION__, a_Index);
|
||||||
return "";
|
return "";
|
||||||
|
@ -75,7 +75,3 @@ void cSignEntity::SendTo(cClientHandle & a_Client)
|
||||||
{
|
{
|
||||||
a_Client.SendUpdateSign(m_PosX, m_PosY, m_PosZ, m_Line[0], m_Line[1], m_Line[2], m_Line[3]);
|
a_Client.SendUpdateSign(m_PosX, m_PosY, m_PosZ, m_Line[0], m_Line[1], m_Line[2], m_Line[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,15 +17,25 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
|
||||||
{
|
|
||||||
// Don't drop anything
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
||||||
{
|
{
|
||||||
return (a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) == E_BLOCK_SAND);
|
if (a_RelY <= 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BLOCKTYPE BelowBlock = a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ);
|
||||||
|
switch (BelowBlock)
|
||||||
|
{
|
||||||
|
case E_BLOCK_CLAY:
|
||||||
|
case E_BLOCK_HARDENED_CLAY:
|
||||||
|
case E_BLOCK_STAINED_CLAY:
|
||||||
|
case E_BLOCK_SAND:
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "BlockHandler.h"
|
#include "BlockHandler.h"
|
||||||
|
#include "ChunkInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,6 +11,7 @@
|
||||||
class cBlockTallGrassHandler :
|
class cBlockTallGrassHandler :
|
||||||
public cBlockHandler
|
public cBlockHandler
|
||||||
{
|
{
|
||||||
|
typedef cBlockHandler super;
|
||||||
public:
|
public:
|
||||||
cBlockTallGrassHandler(BLOCKTYPE a_BlockType)
|
cBlockTallGrassHandler(BLOCKTYPE a_BlockType)
|
||||||
: cBlockHandler(a_BlockType)
|
: cBlockHandler(a_BlockType)
|
||||||
|
@ -26,32 +28,58 @@ public:
|
||||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
||||||
{
|
{
|
||||||
// Drop seeds, sometimes
|
// Drop seeds, sometimes
|
||||||
MTRand r1;
|
cFastRandom Random;
|
||||||
if (r1.randInt(10) == 5)
|
if (Random.NextInt(8) == 0)
|
||||||
{
|
{
|
||||||
a_Pickups.push_back(cItem(E_ITEM_SEEDS, 1, 0));
|
a_Pickups.push_back(cItem(E_ITEM_SEEDS, 1, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual void OnDestroyedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) override
|
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_CanDrop) override
|
||||||
{
|
{
|
||||||
NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
if (a_CanDrop && (a_Digger != NULL) && (a_Digger->GetEquippedWeapon().m_ItemType == E_ITEM_SHEARS))
|
||||||
|
|
||||||
if ((!a_Player->IsGameModeCreative()) && (a_Player->GetEquippedItem().m_ItemType == E_ITEM_SHEARS))
|
|
||||||
{
|
{
|
||||||
cItems Pickups;
|
NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||||
Pickups.Add(E_BLOCK_TALL_GRASS, 1, Meta);
|
cItems Drops;
|
||||||
a_WorldInterface.SpawnItemPickups(Pickups, a_BlockX, a_BlockY, a_BlockZ);
|
Drops.Add(m_BlockType, 1, Meta);
|
||||||
|
|
||||||
a_Player->UseEquippedItem();
|
// Allow plugins to modify the pickups:
|
||||||
|
a_BlockPluginInterface.CallHookBlockToPickups(a_Digger, a_BlockX, a_BlockY, a_BlockZ, m_BlockType, Meta, Drops);
|
||||||
|
|
||||||
|
// Spawn the pickups:
|
||||||
|
if (!Drops.empty())
|
||||||
|
{
|
||||||
|
MTRand r1;
|
||||||
|
|
||||||
|
// Mid-block position first
|
||||||
|
double MicroX, MicroY, MicroZ;
|
||||||
|
MicroX = a_BlockX + 0.5;
|
||||||
|
MicroY = a_BlockY + 0.5;
|
||||||
|
MicroZ = a_BlockZ + 0.5;
|
||||||
|
|
||||||
|
// Add random offset second
|
||||||
|
MicroX += r1.rand(1) - 0.5;
|
||||||
|
MicroZ += r1.rand(1) - 0.5;
|
||||||
|
|
||||||
|
a_WorldInterface.SpawnItemPickups(Drops, MicroX, MicroY, MicroZ);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY, a_BlockZ, a_CanDrop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
||||||
{
|
{
|
||||||
return ((a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR));
|
if (a_RelY <= 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BLOCKTYPE BelowBlock = a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ);
|
||||||
|
return IsBlockTypeOfDirt(BelowBlock);
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,6 @@ public:
|
||||||
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
|
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
|
||||||
) override
|
) override
|
||||||
{
|
{
|
||||||
UNUSED(a_Player);
|
|
||||||
UNUSED(a_CursorX);
|
|
||||||
UNUSED(a_CursorY);
|
|
||||||
UNUSED(a_CursorZ);
|
|
||||||
// TODO: Disallow placement where the vine doesn't attach to something properly
|
// TODO: Disallow placement where the vine doesn't attach to something properly
|
||||||
BLOCKTYPE BlockType = 0;
|
BLOCKTYPE BlockType = 0;
|
||||||
NIBBLETYPE BlockMeta;
|
NIBBLETYPE BlockMeta;
|
||||||
|
@ -80,7 +76,21 @@ public:
|
||||||
/// Returns true if the specified block type is good for vines to attach to
|
/// Returns true if the specified block type is good for vines to attach to
|
||||||
static bool IsBlockAttachable(BLOCKTYPE a_BlockType)
|
static bool IsBlockAttachable(BLOCKTYPE a_BlockType)
|
||||||
{
|
{
|
||||||
return ((a_BlockType == E_BLOCK_LEAVES) || (a_BlockType == E_BLOCK_NEW_LEAVES) || cBlockInfo::IsSolid(a_BlockType));
|
switch (a_BlockType)
|
||||||
|
{
|
||||||
|
case E_BLOCK_GLASS:
|
||||||
|
case E_BLOCK_STAINED_GLASS:
|
||||||
|
case E_BLOCK_CHEST:
|
||||||
|
case E_BLOCK_TRAPPED_CHEST:
|
||||||
|
{
|
||||||
|
// You can't attach a vine to this solid blocks.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return cBlockInfo::IsSolid(a_BlockType);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ public:
|
||||||
|
|
||||||
/// The type used for any heightmap operations and storage; idx = x + Width * z; Height points to the highest non-air block in the column
|
/// The type used for any heightmap operations and storage; idx = x + Width * z; Height points to the highest non-air block in the column
|
||||||
typedef HEIGHTTYPE HeightMap[Width * Width];
|
typedef HEIGHTTYPE HeightMap[Width * Width];
|
||||||
|
|
||||||
/** The type used for any biomemap operations and storage inside MCServer,
|
/** The type used for any biomemap operations and storage inside MCServer,
|
||||||
using MCServer biomes (need not correspond to client representation!)
|
using MCServer biomes (need not correspond to client representation!)
|
||||||
idx = x + Width * z // Need to verify this with the protocol spec, currently unknown!
|
idx = x + Width * z // Need to verify this with the protocol spec, currently unknown!
|
||||||
|
@ -95,8 +95,8 @@ public:
|
||||||
a_X = a_X - a_ChunkX * Width;
|
a_X = a_X - a_ChunkX * Width;
|
||||||
a_Z = a_Z - a_ChunkZ * Width;
|
a_Z = a_Z - a_ChunkZ * Width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Converts absolute block coords to chunk coords:
|
/// Converts absolute block coords to chunk coords:
|
||||||
inline static void BlockToChunk(int a_X, int a_Z, int & a_ChunkX, int & a_ChunkZ)
|
inline static void BlockToChunk(int a_X, int a_Z, int & a_ChunkX, int & a_ChunkZ)
|
||||||
{
|
{
|
||||||
|
@ -165,15 +165,15 @@ public:
|
||||||
ASSERT((a_Z >= 0) && (a_Z < Width));
|
ASSERT((a_Z >= 0) && (a_Z < Width));
|
||||||
a_BlockTypes[MakeIndexNoCheck(a_X, a_Y, a_Z)] = a_Type;
|
a_BlockTypes[MakeIndexNoCheck(a_X, a_Y, a_Z)] = a_Type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline static void SetBlock(BLOCKTYPE * a_BlockTypes, int a_Index, BLOCKTYPE a_Type)
|
inline static void SetBlock(BLOCKTYPE * a_BlockTypes, int a_Index, BLOCKTYPE a_Type)
|
||||||
{
|
{
|
||||||
ASSERT((a_Index >= 0) && (a_Index <= NumBlocks));
|
ASSERT((a_Index >= 0) && (a_Index <= NumBlocks));
|
||||||
a_BlockTypes[a_Index] = a_Type;
|
a_BlockTypes[a_Index] = a_Type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline static BLOCKTYPE GetBlock(const BLOCKTYPE * a_BlockTypes, int a_X, int a_Y, int a_Z)
|
inline static BLOCKTYPE GetBlock(const BLOCKTYPE * a_BlockTypes, int a_X, int a_Y, int a_Z)
|
||||||
{
|
{
|
||||||
ASSERT((a_X >= 0) && (a_X < Width));
|
ASSERT((a_X >= 0) && (a_X < Width));
|
||||||
|
@ -181,39 +181,39 @@ public:
|
||||||
ASSERT((a_Z >= 0) && (a_Z < Width));
|
ASSERT((a_Z >= 0) && (a_Z < Width));
|
||||||
return a_BlockTypes[MakeIndexNoCheck(a_X, a_Y, a_Z)];
|
return a_BlockTypes[MakeIndexNoCheck(a_X, a_Y, a_Z)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline static BLOCKTYPE GetBlock(const BLOCKTYPE * a_BlockTypes, int a_Idx)
|
inline static BLOCKTYPE GetBlock(const BLOCKTYPE * a_BlockTypes, int a_Idx)
|
||||||
{
|
{
|
||||||
ASSERT((a_Idx >= 0) && (a_Idx < NumBlocks));
|
ASSERT((a_Idx >= 0) && (a_Idx < NumBlocks));
|
||||||
return a_BlockTypes[a_Idx];
|
return a_BlockTypes[a_Idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline static int GetHeight(const HeightMap & a_HeightMap, int a_X, int a_Z)
|
inline static int GetHeight(const HeightMap & a_HeightMap, int a_X, int a_Z)
|
||||||
{
|
{
|
||||||
ASSERT((a_X >= 0) && (a_X < Width));
|
ASSERT((a_X >= 0) && (a_X < Width));
|
||||||
ASSERT((a_Z >= 0) && (a_Z < Width));
|
ASSERT((a_Z >= 0) && (a_Z < Width));
|
||||||
return a_HeightMap[a_X + Width * a_Z];
|
return a_HeightMap[a_X + Width * a_Z];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline static void SetHeight(HeightMap & a_HeightMap, int a_X, int a_Z, unsigned char a_Height)
|
inline static void SetHeight(HeightMap & a_HeightMap, int a_X, int a_Z, unsigned char a_Height)
|
||||||
{
|
{
|
||||||
ASSERT((a_X >= 0) && (a_X < Width));
|
ASSERT((a_X >= 0) && (a_X < Width));
|
||||||
ASSERT((a_Z >= 0) && (a_Z < Width));
|
ASSERT((a_Z >= 0) && (a_Z < Width));
|
||||||
a_HeightMap[a_X + Width * a_Z] = a_Height;
|
a_HeightMap[a_X + Width * a_Z] = a_Height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline static EMCSBiome GetBiome(const BiomeMap & a_BiomeMap, int a_X, int a_Z)
|
inline static EMCSBiome GetBiome(const BiomeMap & a_BiomeMap, int a_X, int a_Z)
|
||||||
{
|
{
|
||||||
ASSERT((a_X >= 0) && (a_X < Width));
|
ASSERT((a_X >= 0) && (a_X < Width));
|
||||||
ASSERT((a_Z >= 0) && (a_Z < Width));
|
ASSERT((a_Z >= 0) && (a_Z < Width));
|
||||||
return a_BiomeMap[a_X + Width * a_Z];
|
return a_BiomeMap[a_X + Width * a_Z];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline static void SetBiome(BiomeMap & a_BiomeMap, int a_X, int a_Z, EMCSBiome a_Biome)
|
inline static void SetBiome(BiomeMap & a_BiomeMap, int a_X, int a_Z, EMCSBiome a_Biome)
|
||||||
{
|
{
|
||||||
ASSERT((a_X >= 0) && (a_X < Width));
|
ASSERT((a_X >= 0) && (a_X < Width));
|
||||||
|
@ -226,11 +226,11 @@ public:
|
||||||
{
|
{
|
||||||
if ((a_BlockIdx > -1) && (a_BlockIdx < NumBlocks))
|
if ((a_BlockIdx > -1) && (a_BlockIdx < NumBlocks))
|
||||||
{
|
{
|
||||||
if ((size_t)(a_BlockIdx / 2) >= a_Buffer.size())
|
if (static_cast<size_t>(a_BlockIdx / 2) >= a_Buffer.size())
|
||||||
{
|
{
|
||||||
return (a_IsSkyLightNibble ? 0xff : 0);
|
return (a_IsSkyLightNibble ? 0xff : 0);
|
||||||
}
|
}
|
||||||
return (a_Buffer[(size_t)(a_BlockIdx / 2)] >> ((a_BlockIdx & 1) * 4)) & 0x0f;
|
return (a_Buffer[static_cast<size_t>(a_BlockIdx / 2)] >> ((a_BlockIdx & 1) * 4)) & 0x0f;
|
||||||
}
|
}
|
||||||
ASSERT(!"cChunkDef::GetNibble(): index out of chunk range!");
|
ASSERT(!"cChunkDef::GetNibble(): index out of chunk range!");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -241,7 +241,7 @@ public:
|
||||||
{
|
{
|
||||||
if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1))
|
if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1))
|
||||||
{
|
{
|
||||||
size_t Index = (size_t)MakeIndexNoCheck(x, y, z);
|
size_t Index = static_cast<size_t>(MakeIndexNoCheck(x, y, z));
|
||||||
if ((Index / 2) >= a_Buffer.size())
|
if ((Index / 2) >= a_Buffer.size())
|
||||||
{
|
{
|
||||||
return (a_IsSkyLightNibble ? 0xff : 0);
|
return (a_IsSkyLightNibble ? 0xff : 0);
|
||||||
|
@ -258,7 +258,7 @@ public:
|
||||||
if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1))
|
if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1))
|
||||||
{
|
{
|
||||||
int Index = MakeIndexNoCheck(x, y, z);
|
int Index = MakeIndexNoCheck(x, y, z);
|
||||||
return (a_Buffer[(size_t)(Index / 2)] >> ((Index & 1) * 4)) & 0x0f;
|
return (a_Buffer[static_cast<size_t>(Index / 2)] >> ((Index & 1) * 4)) & 0x0f;
|
||||||
}
|
}
|
||||||
ASSERT(!"cChunkDef::GetNibble(): coords out of chunk range!");
|
ASSERT(!"cChunkDef::GetNibble(): coords out of chunk range!");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -272,11 +272,11 @@ public:
|
||||||
ASSERT(!"cChunkDef::SetNibble(): index out of range!");
|
ASSERT(!"cChunkDef::SetNibble(): index out of range!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ((size_t)(a_BlockIdx / 2) >= a_Buffer.size())
|
if (static_cast<size_t>(a_BlockIdx / 2) >= a_Buffer.size())
|
||||||
{
|
{
|
||||||
a_Buffer.resize((size_t)((a_BlockIdx / 2) + 1));
|
a_Buffer.resize(static_cast<size_t>((a_BlockIdx / 2) + 1));
|
||||||
}
|
}
|
||||||
a_Buffer[(size_t)(a_BlockIdx / 2)] = PackNibble(a_Buffer, (size_t)a_BlockIdx, a_Nibble);
|
a_Buffer[static_cast<size_t>(a_BlockIdx / 2)] = PackNibble(a_Buffer, static_cast<size_t>(a_BlockIdx), a_Nibble);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -292,7 +292,7 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Index = (size_t)MakeIndexNoCheck(x, y, z);
|
size_t Index = static_cast<size_t>(MakeIndexNoCheck(x, y, z));
|
||||||
if ((Index / 2) >= a_Buffer.size())
|
if ((Index / 2) >= a_Buffer.size())
|
||||||
{
|
{
|
||||||
a_Buffer.resize(((Index / 2) + 1));
|
a_Buffer.resize(((Index / 2) + 1));
|
||||||
|
@ -336,7 +336,7 @@ public:
|
||||||
|
|
||||||
/// Called for clients that are in Chunk1 and not in Chunk2,
|
/// Called for clients that are in Chunk1 and not in Chunk2,
|
||||||
virtual void Removed(cClientHandle * a_Client) = 0;
|
virtual void Removed(cClientHandle * a_Client) = 0;
|
||||||
|
|
||||||
/// Called for clients that are in Chunk2 and not in Chunk1.
|
/// Called for clients that are in Chunk2 and not in Chunk1.
|
||||||
virtual void Added(cClientHandle * a_Client) = 0;
|
virtual void Added(cClientHandle * a_Client) = 0;
|
||||||
} ;
|
} ;
|
||||||
|
@ -373,9 +373,9 @@ class cChunkCoords
|
||||||
public:
|
public:
|
||||||
int m_ChunkX;
|
int m_ChunkX;
|
||||||
int m_ChunkZ;
|
int m_ChunkZ;
|
||||||
|
|
||||||
cChunkCoords(int a_ChunkX, int a_ChunkZ) : m_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ) {}
|
cChunkCoords(int a_ChunkX, int a_ChunkZ) : m_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ) {}
|
||||||
|
|
||||||
bool operator == (const cChunkCoords & a_Other) const
|
bool operator == (const cChunkCoords & a_Other) const
|
||||||
{
|
{
|
||||||
return ((m_ChunkX == a_Other.m_ChunkX) && (m_ChunkZ == a_Other.m_ChunkZ));
|
return ((m_ChunkX == a_Other.m_ChunkX) && (m_ChunkZ == a_Other.m_ChunkZ));
|
||||||
|
@ -432,12 +432,12 @@ public:
|
||||||
int y;
|
int y;
|
||||||
int z;
|
int z;
|
||||||
X Data;
|
X Data;
|
||||||
|
|
||||||
cCoordWithData(int a_X, int a_Y, int a_Z) :
|
cCoordWithData(int a_X, int a_Y, int a_Z) :
|
||||||
x(a_X), y(a_Y), z(a_Z), Data()
|
x(a_X), y(a_Y), z(a_Z), Data()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
cCoordWithData(int a_X, int a_Y, int a_Z, const X & a_Data) :
|
cCoordWithData(int a_X, int a_Y, int a_Z, const X & a_Data) :
|
||||||
x(a_X), y(a_Y), z(a_Z), Data(a_Data)
|
x(a_X), y(a_Y), z(a_Z), Data(a_Data)
|
||||||
{
|
{
|
||||||
|
@ -478,7 +478,3 @@ public:
|
||||||
typedef cCoordWithDoubleData <BLOCKTYPE, bool> cCoordWithBlockAndBool;
|
typedef cCoordWithDoubleData <BLOCKTYPE, bool> cCoordWithBlockAndBool;
|
||||||
|
|
||||||
typedef std::vector<cCoordWithBlockAndBool> cCoordWithBlockAndBoolVector;
|
typedef std::vector<cCoordWithBlockAndBool> cCoordWithBlockAndBoolVector;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ enum eBlockFace
|
||||||
BLOCK_FACE_YP = 1, // Interacting with the Y+ face of the block
|
BLOCK_FACE_YP = 1, // Interacting with the Y+ face of the block
|
||||||
BLOCK_FACE_ZM = 2, // Interacting with the Z- face of the block
|
BLOCK_FACE_ZM = 2, // Interacting with the Z- face of the block
|
||||||
BLOCK_FACE_ZP = 3, // Interacting with the Z+ face of the block
|
BLOCK_FACE_ZP = 3, // Interacting with the Z+ face of the block
|
||||||
|
|
||||||
// Synonyms using the (deprecated) world directions:
|
// Synonyms using the (deprecated) world directions:
|
||||||
BLOCK_FACE_BOTTOM = BLOCK_FACE_YM, // Interacting with the bottom face of the block
|
BLOCK_FACE_BOTTOM = BLOCK_FACE_YM, // Interacting with the bottom face of the block
|
||||||
BLOCK_FACE_TOP = BLOCK_FACE_YP, // Interacting with the top face of the block
|
BLOCK_FACE_TOP = BLOCK_FACE_YP, // Interacting with the top face of the block
|
||||||
|
@ -101,7 +101,7 @@ enum eClickAction
|
||||||
caDblClick,
|
caDblClick,
|
||||||
// Add new actions here
|
// Add new actions here
|
||||||
caUnknown = 255,
|
caUnknown = 255,
|
||||||
|
|
||||||
// Keep this list in sync with ClickActionToString() function below!
|
// Keep this list in sync with ClickActionToString() function below!
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -116,14 +116,14 @@ enum eGameMode
|
||||||
eGameMode_Creative = 1,
|
eGameMode_Creative = 1,
|
||||||
eGameMode_Adventure = 2,
|
eGameMode_Adventure = 2,
|
||||||
eGameMode_Spectator = 3,
|
eGameMode_Spectator = 3,
|
||||||
|
|
||||||
// Easier-to-use synonyms:
|
// Easier-to-use synonyms:
|
||||||
gmNotSet = eGameMode_NotSet,
|
gmNotSet = eGameMode_NotSet,
|
||||||
gmSurvival = eGameMode_Survival,
|
gmSurvival = eGameMode_Survival,
|
||||||
gmCreative = eGameMode_Creative,
|
gmCreative = eGameMode_Creative,
|
||||||
gmAdventure = eGameMode_Adventure,
|
gmAdventure = eGameMode_Adventure,
|
||||||
gmSpectator = eGameMode_Spectator,
|
gmSpectator = eGameMode_Spectator,
|
||||||
|
|
||||||
// These two are used to check GameMode for validity when converting from integers.
|
// These two are used to check GameMode for validity when converting from integers.
|
||||||
gmMax, // Gets automatically assigned
|
gmMax, // Gets automatically assigned
|
||||||
gmMin = 0,
|
gmMin = 0,
|
||||||
|
@ -138,7 +138,7 @@ enum eWeather
|
||||||
eWeather_Sunny = 0,
|
eWeather_Sunny = 0,
|
||||||
eWeather_Rain = 1,
|
eWeather_Rain = 1,
|
||||||
eWeather_ThunderStorm = 2,
|
eWeather_ThunderStorm = 2,
|
||||||
|
|
||||||
// Easier-to-use synonyms:
|
// Easier-to-use synonyms:
|
||||||
wSunny = eWeather_Sunny,
|
wSunny = eWeather_Sunny,
|
||||||
wRain = eWeather_Rain,
|
wRain = eWeather_Rain,
|
||||||
|
@ -218,7 +218,7 @@ inline const char * ClickActionToString(eClickAction a_ClickAction)
|
||||||
case caLeftPaintEnd: return "caLeftPaintEnd";
|
case caLeftPaintEnd: return "caLeftPaintEnd";
|
||||||
case caRightPaintEnd: return "caRightPaintEnd";
|
case caRightPaintEnd: return "caRightPaintEnd";
|
||||||
case caDblClick: return "caDblClick";
|
case caDblClick: return "caDblClick";
|
||||||
|
|
||||||
case caUnknown: return "caUnknown";
|
case caUnknown: return "caUnknown";
|
||||||
}
|
}
|
||||||
ASSERT(!"Unknown click action");
|
ASSERT(!"Unknown click action");
|
||||||
|
@ -472,7 +472,7 @@ inline void AddFaceDirection(int & a_BlockX, unsigned char & a_BlockY, int & a_B
|
||||||
{
|
{
|
||||||
int Y = a_BlockY;
|
int Y = a_BlockY;
|
||||||
AddFaceDirection(a_BlockX, Y, a_BlockZ, a_BlockFace, a_bInverse);
|
AddFaceDirection(a_BlockX, Y, a_BlockZ, a_BlockFace, a_bInverse);
|
||||||
a_BlockY = Clamp<unsigned char>((unsigned char)Y, 0, 255);
|
a_BlockY = Clamp<unsigned char>(static_cast<unsigned char>(Y), 0, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -556,7 +556,7 @@ enum eMessageType
|
||||||
mtPrivateMessage, // Player to player messaging identifier
|
mtPrivateMessage, // Player to player messaging identifier
|
||||||
mtJoin, // A player has joined the server
|
mtJoin, // A player has joined the server
|
||||||
mtLeave, // A player has left the server
|
mtLeave, // A player has left the server
|
||||||
|
|
||||||
// Common aliases:
|
// Common aliases:
|
||||||
mtFail = mtFailure,
|
mtFail = mtFailure,
|
||||||
mtError = mtFailure,
|
mtError = mtFailure,
|
||||||
|
@ -626,9 +626,9 @@ namespace ItemCategory
|
||||||
|| (a_ItemID == E_ITEM_GOLD_HOE)
|
|| (a_ItemID == E_ITEM_GOLD_HOE)
|
||||||
|| (a_ItemID == E_ITEM_DIAMOND_HOE);
|
|| (a_ItemID == E_ITEM_DIAMOND_HOE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline bool IsShovel(short a_ItemID)
|
inline bool IsShovel(short a_ItemID)
|
||||||
{
|
{
|
||||||
return (a_ItemID == E_ITEM_WOODEN_SHOVEL)
|
return (a_ItemID == E_ITEM_WOODEN_SHOVEL)
|
||||||
|
@ -648,9 +648,9 @@ namespace ItemCategory
|
||||||
|| IsHoe ( a_ItemID)
|
|| IsHoe ( a_ItemID)
|
||||||
|| IsShovel ( a_ItemID);
|
|| IsShovel ( a_ItemID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline bool IsHelmet(short a_ItemType)
|
inline bool IsHelmet(short a_ItemType)
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
|
@ -700,9 +700,9 @@ namespace ItemCategory
|
||||||
(a_ItemType == E_ITEM_DIAMOND_BOOTS)
|
(a_ItemType == E_ITEM_DIAMOND_BOOTS)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline bool IsArmor(short a_ItemType)
|
inline bool IsArmor(short a_ItemType)
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
|
@ -715,7 +715,3 @@ namespace ItemCategory
|
||||||
}
|
}
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// ArrowEntity.h
|
// ArrowEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cArrowEntity representing the arrow that has been shot by the player or by a skeleton
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -19,7 +24,7 @@ class cArrowEntity :
|
||||||
typedef cProjectileEntity super;
|
typedef cProjectileEntity super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Determines when the arrow can be picked up (depending on player gamemode). Corresponds to the MCA file "pickup" field
|
/** Determines when the arrow can be picked up (depending on player gamemode). Corresponds to the MCA file "pickup" field */
|
||||||
enum ePickupState
|
enum ePickupState
|
||||||
{
|
{
|
||||||
psNoPickup = 0,
|
psNoPickup = 0,
|
||||||
|
@ -31,33 +36,33 @@ public:
|
||||||
|
|
||||||
CLASS_PROTODEF(cArrowEntity)
|
CLASS_PROTODEF(cArrowEntity)
|
||||||
|
|
||||||
/// Creates a new arrow with psNoPickup state and default damage modifier coeff
|
/** Creates a new arrow with psNoPickup state and default damage modifier coeff */
|
||||||
cArrowEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);
|
cArrowEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);
|
||||||
|
|
||||||
/// Creates a new arrow as shot by a player, initializes it from the player object
|
/** Creates a new arrow as shot by a player, initializes it from the player object */
|
||||||
cArrowEntity(cPlayer & a_Player, double a_Force);
|
cArrowEntity(cPlayer & a_Player, double a_Force);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Returns whether the arrow can be picked up by players
|
/** Returns whether the arrow can be picked up by players */
|
||||||
ePickupState GetPickupState(void) const { return m_PickupState; }
|
ePickupState GetPickupState(void) const { return m_PickupState; }
|
||||||
|
|
||||||
/// Sets a new pickup state
|
/** Sets a new pickup state */
|
||||||
void SetPickupState(ePickupState a_PickupState) { m_PickupState = a_PickupState; }
|
void SetPickupState(ePickupState a_PickupState) { m_PickupState = a_PickupState; }
|
||||||
|
|
||||||
/// Returns the damage modifier coeff.
|
/** Returns the damage modifier coeff. */
|
||||||
double GetDamageCoeff(void) const { return m_DamageCoeff; }
|
double GetDamageCoeff(void) const { return m_DamageCoeff; }
|
||||||
|
|
||||||
/// Sets the damage modifier coeff
|
/** Sets the damage modifier coeff */
|
||||||
void SetDamageCoeff(double a_DamageCoeff) { m_DamageCoeff = a_DamageCoeff; }
|
void SetDamageCoeff(double a_DamageCoeff) { m_DamageCoeff = a_DamageCoeff; }
|
||||||
|
|
||||||
/// Returns true if the specified player can pick the arrow up
|
/** Returns true if the specified player can pick the arrow up */
|
||||||
bool CanPickup(const cPlayer & a_Player) const;
|
bool CanPickup(const cPlayer & a_Player) const;
|
||||||
|
|
||||||
/// Returns true if the arrow is set as critical
|
/** Returns true if the arrow is set as critical */
|
||||||
bool IsCritical(void) const { return m_IsCritical; }
|
bool IsCritical(void) const { return m_IsCritical; }
|
||||||
|
|
||||||
/// Sets the IsCritical flag
|
/** Sets the IsCritical flag */
|
||||||
void SetIsCritical(bool a_IsCritical) { m_IsCritical = a_IsCritical; }
|
void SetIsCritical(bool a_IsCritical) { m_IsCritical = a_IsCritical; }
|
||||||
|
|
||||||
/** Gets the block arrow is in */
|
/** Gets the block arrow is in */
|
||||||
|
@ -70,28 +75,28 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// Determines when the arrow can be picked up by players
|
/** Determines when the arrow can be picked up by players */
|
||||||
ePickupState m_PickupState;
|
ePickupState m_PickupState;
|
||||||
|
|
||||||
/// The coefficient applied to the damage that the arrow will deal, based on the bow enchantment. 2.0 for normal arrow
|
/** The coefficient applied to the damage that the arrow will deal, based on the bow enchantment. 2.0 for normal arrow */
|
||||||
double m_DamageCoeff;
|
double m_DamageCoeff;
|
||||||
|
|
||||||
/// If true, the arrow deals more damage
|
/** If true, the arrow deals more damage */
|
||||||
bool m_IsCritical;
|
bool m_IsCritical;
|
||||||
|
|
||||||
/// Timer for pickup collection animation or five minute timeout
|
/** Timer for pickup collection animation or five minute timeout */
|
||||||
float m_Timer;
|
float m_Timer;
|
||||||
|
|
||||||
/// Timer for client arrow position confirmation via TeleportEntity
|
/** Timer for client arrow position confirmation via TeleportEntity */
|
||||||
float m_HitGroundTimer;
|
float m_HitGroundTimer;
|
||||||
|
|
||||||
// Whether the arrow has already been teleported into the proper position in the ground.
|
// Whether the arrow has already been teleported into the proper position in the ground.
|
||||||
bool m_HasTeleported;
|
bool m_HasTeleported;
|
||||||
|
|
||||||
/// If true, the arrow is in the process of being collected - don't go to anyone else
|
/** If true, the arrow is in the process of being collected - don't go to anyone else */
|
||||||
bool m_bIsCollected;
|
bool m_bIsCollected;
|
||||||
|
|
||||||
/// Stores the block position that arrow is lodged into, sets m_IsInGround to false if it becomes air
|
/** Stores the block position that arrow is lodged into, sets m_IsInGround to false if it becomes air */
|
||||||
Vector3i m_HitBlockPos;
|
Vector3i m_HitBlockPos;
|
||||||
|
|
||||||
// cProjectileEntity overrides:
|
// cProjectileEntity overrides:
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// ExpBottleEntity.h
|
// ExpBottleEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cExpBottleEntity class representing the thrown exp bottle
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -33,6 +38,10 @@ protected:
|
||||||
|
|
||||||
/** Breaks the bottle, fires its particle effects and sounds
|
/** Breaks the bottle, fires its particle effects and sounds
|
||||||
@param a_HitPos The position where the bottle will break */
|
@param a_HitPos The position where the bottle will break */
|
||||||
void Break(const Vector3d &a_HitPos);
|
void Break(const Vector3d & a_HitPos);
|
||||||
|
|
||||||
}; // tolua_export
|
}; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// FireChargeEntity.h
|
// FireChargeEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cFireChargeEntity representing the fire charge shot by the blaze
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -34,3 +39,7 @@ protected:
|
||||||
virtual void OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
virtual void OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
||||||
|
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
cFireworkEntity::cFireworkEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const cItem & a_Item) :
|
cFireworkEntity::cFireworkEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const cItem & a_Item) :
|
||||||
super(pkFirework, a_Creator, a_X, a_Y, a_Z, 0.25, 0.25),
|
super(pkFirework, a_Creator, a_X, a_Y, a_Z, 0.25, 0.25),
|
||||||
m_ExplodeTimer(0),
|
m_TicksToExplosion(a_Item.m_FireworkItem.m_FlightTimeInTicks),
|
||||||
m_FireworkItem(a_Item)
|
m_FireworkItem(a_Item)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,9 @@ void cFireworkEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
|
||||||
|
|
||||||
if ((PosY < 0) || (PosY >= cChunkDef::Height))
|
if ((PosY < 0) || (PosY >= cChunkDef::Height))
|
||||||
{
|
{
|
||||||
goto setspeed;
|
AddSpeedY(1);
|
||||||
|
AddPosition(GetSpeed() * (a_Dt / 1000));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_IsInGround)
|
if (m_IsInGround)
|
||||||
|
@ -50,7 +52,6 @@ void cFireworkEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setspeed:
|
|
||||||
AddSpeedY(1);
|
AddSpeedY(1);
|
||||||
AddPosition(GetSpeed() * (a_Dt / 1000));
|
AddPosition(GetSpeed() * (a_Dt / 1000));
|
||||||
}
|
}
|
||||||
|
@ -63,11 +64,13 @@ void cFireworkEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
||||||
{
|
{
|
||||||
super::Tick(a_Dt, a_Chunk);
|
super::Tick(a_Dt, a_Chunk);
|
||||||
|
|
||||||
if (m_ExplodeTimer == m_FireworkItem.m_FireworkItem.m_FlightTimeInTicks)
|
if (m_TicksToExplosion <= 0)
|
||||||
{
|
{
|
||||||
|
// TODO: Notify the plugins
|
||||||
m_World->BroadcastEntityStatus(*this, esFireworkExploding);
|
m_World->BroadcastEntityStatus(*this, esFireworkExploding);
|
||||||
Destroy();
|
Destroy();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_ExplodeTimer++;
|
m_TicksToExplosion -= 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// FireworkEntity.h
|
// FireworkEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cFireworkEntity class representing the flying firework rocket
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -24,7 +29,22 @@ public:
|
||||||
CLASS_PROTODEF(cFireworkEntity)
|
CLASS_PROTODEF(cFireworkEntity)
|
||||||
|
|
||||||
cFireworkEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const cItem & a_Item);
|
cFireworkEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const cItem & a_Item);
|
||||||
|
|
||||||
|
// tolua_begin
|
||||||
|
|
||||||
|
/** Returns the item used to create the rocket (has all the firework effects on it) */
|
||||||
const cItem & GetItem(void) const { return m_FireworkItem; }
|
const cItem & GetItem(void) const { return m_FireworkItem; }
|
||||||
|
|
||||||
|
/** Sets the item that is used to create the rocket (has all the firework effects on it) */
|
||||||
|
void SetItem(const cItem & a_Item) { m_FireworkItem = a_Item; }
|
||||||
|
|
||||||
|
/** Returns the number of ticks left until the firework explosion. */
|
||||||
|
int GetTicksToExplosion(void) const { return m_TicksToExplosion; }
|
||||||
|
|
||||||
|
/** Sets the number of ticks left until the firework explosion. */
|
||||||
|
void SetTicksToExplosion(int a_TicksToExplosion) { m_TicksToExplosion = a_TicksToExplosion; }
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -34,7 +54,11 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int m_ExplodeTimer;
|
int m_TicksToExplosion;
|
||||||
cItem m_FireworkItem;
|
cItem m_FireworkItem;
|
||||||
|
|
||||||
}; // tolua_export
|
}; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// GhastFireballEntity.h
|
// GhastFireballEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cGhastFireballEntity class representing the ghast fireball in flight.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -36,3 +41,7 @@ protected:
|
||||||
// TODO: Deflecting the fireballs by arrow- or sword- hits
|
// TODO: Deflecting the fireballs by arrow- or sword- hits
|
||||||
|
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,9 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cHangingEntity::cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z)
|
cHangingEntity::cHangingEntity(eEntityType a_EntityType, eBlockFace a_Facing, double a_X, double a_Y, double a_Z) :
|
||||||
: cEntity(a_EntityType, a_X, a_Y, a_Z, 0.8, 0.8)
|
cEntity(a_EntityType, a_X, a_Y, a_Z, 0.8, 0.8),
|
||||||
, m_BlockFace(a_BlockFace)
|
m_Facing(a_Facing)
|
||||||
{
|
{
|
||||||
SetMaxHealth(1);
|
SetMaxHealth(1);
|
||||||
SetHealth(1);
|
SetHealth(1);
|
||||||
|
@ -21,15 +21,23 @@ cHangingEntity::cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cHangingEntity::SetDirection(eBlockFace a_BlockFace)
|
void cHangingEntity::SetFacing(eBlockFace a_Facing)
|
||||||
{
|
{
|
||||||
if ((a_BlockFace < 2) || (a_BlockFace > 5))
|
// Y-based faces are not allowed:
|
||||||
|
switch (a_Facing)
|
||||||
{
|
{
|
||||||
ASSERT(!"Tried to set a bad direction!");
|
case BLOCK_FACE_NONE:
|
||||||
return;
|
case BLOCK_FACE_YM:
|
||||||
|
case BLOCK_FACE_YP:
|
||||||
|
{
|
||||||
|
LOGWARNING("%s: Invalid facing: %d. Ignoring.", __FUNCTION__, a_Facing);
|
||||||
|
ASSERT(!"Tried to set a bad facing!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_BlockFace = a_BlockFace;
|
m_Facing = a_Facing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,7 +49,7 @@ void cHangingEntity::SpawnOn(cClientHandle & a_ClientHandle)
|
||||||
int Dir = 0;
|
int Dir = 0;
|
||||||
|
|
||||||
// The client uses different values for item frame directions and block faces. Our constants are for the block faces, so we convert them here to item frame faces
|
// The client uses different values for item frame directions and block faces. Our constants are for the block faces, so we convert them here to item frame faces
|
||||||
switch (m_BlockFace)
|
switch (m_Facing)
|
||||||
{
|
{
|
||||||
case BLOCK_FACE_ZP: Dir = 0; break;
|
case BLOCK_FACE_ZP: Dir = 0; break;
|
||||||
case BLOCK_FACE_ZM: Dir = 2; break;
|
case BLOCK_FACE_ZM: Dir = 2; break;
|
||||||
|
@ -49,8 +57,8 @@ void cHangingEntity::SpawnOn(cClientHandle & a_ClientHandle)
|
||||||
case BLOCK_FACE_XP: Dir = 3; break;
|
case BLOCK_FACE_XP: Dir = 3; break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
LOGINFO("Invalid face (%d) in a cHangingEntity at {%d, %d, %d}, adjusting to BLOCK_FACE_XP.",
|
LOGINFO("Invalid facing (%d) in a cHangingEntity at {%d, %d, %d}, adjusting to BLOCK_FACE_XP.",
|
||||||
m_BlockFace, (int)GetPosX(), (int)GetPosY(), (int)GetPosZ()
|
m_Facing, (int)GetPosX(), (int)GetPosY(), (int)GetPosZ()
|
||||||
);
|
);
|
||||||
Dir = 3;
|
Dir = 3;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,36 +11,41 @@
|
||||||
class cHangingEntity :
|
class cHangingEntity :
|
||||||
public cEntity
|
public cEntity
|
||||||
{
|
{
|
||||||
// tolua_end
|
|
||||||
typedef cEntity super;
|
typedef cEntity super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
CLASS_PROTODEF(cHangingEntity)
|
CLASS_PROTODEF(cHangingEntity)
|
||||||
|
|
||||||
cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
||||||
|
|
||||||
/** Returns the orientation from the hanging entity */
|
// tolua_begin
|
||||||
eBlockFace GetDirection() const { return m_BlockFace; } // tolua_export
|
|
||||||
|
/** Returns the direction in which the entity is facing. */
|
||||||
|
eBlockFace GetFacing() const { return m_Facing; }
|
||||||
|
|
||||||
/** Set the orientation from the hanging entity */
|
/** Set the direction in which the entity is facing. */
|
||||||
void SetDirection(eBlockFace a_BlockFace); // tolua_export
|
void SetFacing(eBlockFace a_Facing);
|
||||||
|
|
||||||
/** Returns the X coord. */
|
/** Returns the X coord of the block in which the entity resides. */
|
||||||
int GetTileX() const { return POSX_TOINT; } // tolua_export
|
int GetBlockX() const { return POSX_TOINT; }
|
||||||
|
|
||||||
/** Returns the Y coord. */
|
/** Returns the Y coord of the block in which the entity resides. */
|
||||||
int GetTileY() const { return POSY_TOINT; } // tolua_export
|
int GetBlockY() const { return POSY_TOINT; }
|
||||||
|
|
||||||
/** Returns the Z coord. */
|
/** Returns the Z coord of the block in which the entity resides. */
|
||||||
int GetTileZ() const { return POSZ_TOINT; } // tolua_export
|
int GetBlockZ() const { return POSZ_TOINT; }
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
||||||
virtual void Tick(float a_Dt, cChunk & a_Chunk) override {}
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override {}
|
||||||
|
|
||||||
eBlockFace m_BlockFace;
|
eBlockFace m_Facing;
|
||||||
|
|
||||||
}; // tolua_export
|
}; // tolua_export
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,10 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cItemFrame::cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z)
|
cItemFrame::cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z) :
|
||||||
: cHangingEntity(etItemFrame, a_BlockFace, a_X, a_Y, a_Z)
|
cHangingEntity(etItemFrame, a_BlockFace, a_X, a_Y, a_Z),
|
||||||
, m_Item(E_BLOCK_AIR)
|
m_Item(E_BLOCK_AIR),
|
||||||
, m_Rotation(0)
|
m_ItemRotation(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,10 +27,10 @@ void cItemFrame::OnRightClicked(cPlayer & a_Player)
|
||||||
if (!m_Item.IsEmpty())
|
if (!m_Item.IsEmpty())
|
||||||
{
|
{
|
||||||
// Item not empty, rotate, clipping values to zero to three inclusive
|
// Item not empty, rotate, clipping values to zero to three inclusive
|
||||||
m_Rotation++;
|
m_ItemRotation++;
|
||||||
if (m_Rotation >= 8)
|
if (m_ItemRotation >= 8)
|
||||||
{
|
{
|
||||||
m_Rotation = 0;
|
m_ItemRotation = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!a_Player.GetEquippedItem().IsEmpty())
|
else if (!a_Player.GetEquippedItem().IsEmpty())
|
||||||
|
@ -72,7 +72,7 @@ void cItemFrame::KilledBy(TakeDamageInfo & a_TDI)
|
||||||
|
|
||||||
SetHealth(GetMaxHealth());
|
SetHealth(GetMaxHealth());
|
||||||
m_Item.Empty();
|
m_Item.Empty();
|
||||||
m_Rotation = 0;
|
m_ItemRotation = 0;
|
||||||
SetInvulnerableTicks(0);
|
SetInvulnerableTicks(0);
|
||||||
GetWorld()->BroadcastEntityMetadata(*this);
|
GetWorld()->BroadcastEntityMetadata(*this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,26 +11,31 @@
|
||||||
class cItemFrame :
|
class cItemFrame :
|
||||||
public cHangingEntity
|
public cHangingEntity
|
||||||
{
|
{
|
||||||
// tolua_end
|
|
||||||
typedef cHangingEntity super;
|
typedef cHangingEntity super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
CLASS_PROTODEF(cItemFrame)
|
CLASS_PROTODEF(cItemFrame)
|
||||||
|
|
||||||
cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
||||||
|
|
||||||
|
// tolua_begin
|
||||||
|
|
||||||
/** Returns the item in the frame */
|
/** Returns the item in the frame */
|
||||||
const cItem & GetItem(void) { return m_Item; } // tolua_export
|
const cItem & GetItem(void) { return m_Item; }
|
||||||
|
|
||||||
/** Set the item in the frame */
|
/** Set the item in the frame */
|
||||||
void SetItem(cItem & a_Item) { m_Item = a_Item; } // tolua_export
|
void SetItem(cItem & a_Item) { m_Item = a_Item; }
|
||||||
|
|
||||||
/** Returns the rotation from the item in the frame */
|
/** Returns the rotation from the item in the frame */
|
||||||
Byte GetRotation(void) const { return m_Rotation; } // tolua_export
|
Byte GetItemRotation(void) const { return m_ItemRotation; }
|
||||||
|
|
||||||
/** Set the rotation from the item in the frame */
|
/** Set the rotation from the item in the frame */
|
||||||
void SetRotation(Byte a_Rotation) { m_Rotation = a_Rotation; } // tolua_export
|
void SetItemRotation(Byte a_ItemRotation) { m_ItemRotation = a_ItemRotation; }
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -39,7 +44,7 @@ private:
|
||||||
virtual void GetDrops(cItems & a_Items, cEntity * a_Killer) override;
|
virtual void GetDrops(cItems & a_Items, cEntity * a_Killer) override;
|
||||||
|
|
||||||
cItem m_Item;
|
cItem m_Item;
|
||||||
Byte m_Rotation;
|
Byte m_ItemRotation;
|
||||||
|
|
||||||
}; // tolua_export
|
}; // tolua_export
|
||||||
|
|
||||||
|
|
|
@ -11,15 +11,22 @@
|
||||||
class cPainting :
|
class cPainting :
|
||||||
public cEntity
|
public cEntity
|
||||||
{
|
{
|
||||||
// tolua_end
|
|
||||||
typedef cEntity super;
|
typedef cEntity super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
CLASS_PROTODEF(cPainting)
|
CLASS_PROTODEF(cPainting)
|
||||||
|
|
||||||
cPainting(const AString & a_Name, int a_Direction, double a_X, double a_Y, double a_Z);
|
cPainting(const AString & a_Name, int a_Direction, double a_X, double a_Y, double a_Z);
|
||||||
const AString & GetName(void) const { return m_Name; } // tolua_export
|
|
||||||
int GetDirection(void) const { return m_Direction; } // tolua_export
|
// tolua_begin
|
||||||
|
|
||||||
|
const AString & GetName(void) const { return m_Name; }
|
||||||
|
int GetDirection(void) const { return m_Direction; }
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ class cPickup :
|
||||||
public cEntity
|
public cEntity
|
||||||
{
|
{
|
||||||
typedef cEntity super;
|
typedef cEntity super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
|
@ -37,10 +37,10 @@ public:
|
||||||
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
||||||
|
|
||||||
/** Returns the number of ticks that this entity has existed */
|
/** Returns the number of ticks that this entity has existed */
|
||||||
int GetAge(void) const { return (int)(m_Timer / 50); } // tolua_export
|
int GetAge(void) const { return static_cast<int>(m_Timer / 50); } // tolua_export
|
||||||
|
|
||||||
/** Set the number of ticks that this entity has existed */
|
/** Set the number of ticks that this entity has existed */
|
||||||
void SetAge(int a_Age) { m_Timer = (float)(a_Age * 50); } // tolua_export
|
void SetAge(int a_Age) { m_Timer = static_cast<float>(a_Age * 50); } // tolua_export
|
||||||
|
|
||||||
/** Returns true if the pickup has already been collected */
|
/** Returns true if the pickup has already been collected */
|
||||||
bool IsCollected(void) const { return m_bCollected; } // tolua_export
|
bool IsCollected(void) const { return m_bCollected; } // tolua_export
|
||||||
|
@ -59,7 +59,3 @@ private:
|
||||||
|
|
||||||
bool m_bIsPlayerCreated;
|
bool m_bIsPlayerCreated;
|
||||||
}; // tolua_export
|
}; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
// ProjectileEntity.h
|
// ProjectileEntity.h
|
||||||
|
|
||||||
// Declares the cProjectileEntity class representing the common base class for projectiles, as well as individual projectile types
|
// Declares the cProjectileEntity class representing the common base class for projectiles
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ class cProjectileEntity :
|
||||||
typedef cEntity super;
|
typedef cEntity super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// The kind of the projectile. The numbers correspond to the network type ID used for spawning via the 0x17 packet.
|
/** The kind of the projectile. The numbers correspond to the network type ID used for spawning them in the protocol. */
|
||||||
enum eKind
|
enum eKind
|
||||||
{
|
{
|
||||||
pkArrow = 60,
|
pkArrow = 60,
|
||||||
|
@ -48,22 +48,22 @@ public:
|
||||||
|
|
||||||
static cProjectileEntity * Create(eKind a_Kind, cEntity * a_Creator, double a_X, double a_Y, double a_Z, const cItem * a_Item, const Vector3d * a_Speed = nullptr);
|
static cProjectileEntity * Create(eKind a_Kind, cEntity * a_Creator, double a_X, double a_Y, double a_Z, const cItem * a_Item, const Vector3d * a_Speed = nullptr);
|
||||||
|
|
||||||
/// Called by the physics blocktracer when the entity hits a solid block, the hit position and the face hit (BLOCK_FACE_) is given
|
/** Called by the physics blocktracer when the entity hits a solid block, the hit position and the face hit (BLOCK_FACE_) is given */
|
||||||
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace);
|
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace);
|
||||||
|
|
||||||
/// Called by the physics blocktracer when the entity hits another entity
|
/** Called by the physics blocktracer when the entity hits another entity */
|
||||||
virtual void OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
|
virtual void OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
|
||||||
{
|
{
|
||||||
UNUSED(a_EntityHit);
|
UNUSED(a_EntityHit);
|
||||||
UNUSED(a_HitPos);
|
UNUSED(a_HitPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called by Chunk when the projectile is eligible for player collection
|
/** Called by Chunk when the projectile is eligible for player collection */
|
||||||
virtual void CollectedBy(cPlayer & a_Dest);
|
virtual void CollectedBy(cPlayer & a_Dest);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Returns the kind of the projectile (fast class identification)
|
/** Returns the kind of the projectile (fast class identification) */
|
||||||
eKind GetProjectileKind(void) const { return m_ProjectileKind; }
|
eKind GetProjectileKind(void) const { return m_ProjectileKind; }
|
||||||
|
|
||||||
/** Returns the unique ID of the entity who created this projectile
|
/** Returns the unique ID of the entity who created this projectile
|
||||||
|
@ -76,15 +76,15 @@ public:
|
||||||
*/
|
*/
|
||||||
AString GetCreatorName(void) const { return m_CreatorData.m_Name; }
|
AString GetCreatorName(void) const { return m_CreatorData.m_Name; }
|
||||||
|
|
||||||
/// Returns the string that is used as the entity type (class name) in MCA files
|
/** Returns the string that is used as the entity type (class name) in MCA files */
|
||||||
AString GetMCAClassName(void) const;
|
AString GetMCAClassName(void) const;
|
||||||
|
|
||||||
/// Returns true if the projectile has hit the ground and is stuck there
|
/** Returns true if the projectile has hit the ground and is stuck there */
|
||||||
bool IsInGround(void) const { return m_IsInGround; }
|
bool IsInGround(void) const { return m_IsInGround; }
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/// Sets the internal InGround flag. To be used by MCA loader only!
|
/** Sets the internal InGround flag. To be used by MCA loader only! */
|
||||||
void SetIsInGround(bool a_IsInGround) { m_IsInGround = a_IsInGround; }
|
void SetIsInGround(bool a_IsInGround) { m_IsInGround = a_IsInGround; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -114,7 +114,7 @@ protected:
|
||||||
*/
|
*/
|
||||||
CreatorData m_CreatorData;
|
CreatorData m_CreatorData;
|
||||||
|
|
||||||
/// True if the projectile has hit the ground and is stuck there
|
/** True if the projectile has hit the ground and is stuck there */
|
||||||
bool m_IsInGround;
|
bool m_IsInGround;
|
||||||
|
|
||||||
// cEntity overrides:
|
// cEntity overrides:
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// SplashPotionEntity.h
|
// SplashPotionEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cSplashPotionEntity class representing a splash potion that has been thrown
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -32,6 +37,7 @@ public:
|
||||||
const cItem & a_Item
|
const cItem & a_Item
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// tolua_begin
|
||||||
cEntityEffect::eType GetEntityEffectType(void) const { return m_EntityEffectType; }
|
cEntityEffect::eType GetEntityEffectType(void) const { return m_EntityEffectType; }
|
||||||
cEntityEffect GetEntityEffect(void) const { return m_EntityEffect; }
|
cEntityEffect GetEntityEffect(void) const { return m_EntityEffect; }
|
||||||
int GetPotionColor(void) const { return m_PotionColor; }
|
int GetPotionColor(void) const { return m_PotionColor; }
|
||||||
|
@ -39,6 +45,8 @@ public:
|
||||||
void SetEntityEffectType(cEntityEffect::eType a_EntityEffectType) { m_EntityEffectType = a_EntityEffectType; }
|
void SetEntityEffectType(cEntityEffect::eType a_EntityEffectType) { m_EntityEffectType = a_EntityEffectType; }
|
||||||
void SetEntityEffect(cEntityEffect a_EntityEffect) { m_EntityEffect = a_EntityEffect; }
|
void SetEntityEffect(cEntityEffect a_EntityEffect) { m_EntityEffect = a_EntityEffect; }
|
||||||
void SetPotionColor(int a_PotionColor) { m_PotionColor = a_PotionColor; }
|
void SetPotionColor(int a_PotionColor) { m_PotionColor = a_PotionColor; }
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -77,3 +85,7 @@ private:
|
||||||
/** Time in ticks to wait for the hit animation to begin before destroying */
|
/** Time in ticks to wait for the hit animation to begin before destroying */
|
||||||
int m_DestroyTimer;
|
int m_DestroyTimer;
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,27 @@ void cThrownEggEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_Hit
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cThrownEggEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
||||||
|
{
|
||||||
|
if (m_DestroyTimer > 0)
|
||||||
|
{
|
||||||
|
m_DestroyTimer--;
|
||||||
|
if (m_DestroyTimer == 0)
|
||||||
|
{
|
||||||
|
Destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
super::Tick(a_Dt, a_Chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cThrownEggEntity::TrySpawnChicken(const Vector3d & a_HitPos)
|
void cThrownEggEntity::TrySpawnChicken(const Vector3d & a_HitPos)
|
||||||
{
|
{
|
||||||
if (m_World->GetTickRandomNumber(7) == 1)
|
if (m_World->GetTickRandomNumber(7) == 1)
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// ThrownEggEntity.h
|
// ThrownEggEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cThrownEggEntity class representing a regular thrown egg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -29,23 +34,8 @@ protected:
|
||||||
|
|
||||||
// cProjectileEntity overrides:
|
// cProjectileEntity overrides:
|
||||||
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
||||||
virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
virtual void OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
||||||
virtual void Tick (float a_Dt, cChunk & a_Chunk) override
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
||||||
{
|
|
||||||
if (m_DestroyTimer > 0)
|
|
||||||
{
|
|
||||||
m_DestroyTimer--;
|
|
||||||
if (m_DestroyTimer == 0)
|
|
||||||
{
|
|
||||||
Destroy();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
super::Tick(a_Dt, a_Chunk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Randomly decides whether to spawn a chicken where the egg lands.
|
// Randomly decides whether to spawn a chicken where the egg lands.
|
||||||
void TrySpawnChicken(const Vector3d & a_HitPos);
|
void TrySpawnChicken(const Vector3d & a_HitPos);
|
||||||
|
@ -56,3 +46,7 @@ private:
|
||||||
int m_DestroyTimer;
|
int m_DestroyTimer;
|
||||||
|
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
||||||
|
|
||||||
#include "ThrownEnderPearlEntity.h"
|
#include "ThrownEnderPearlEntity.h"
|
||||||
|
@ -45,6 +46,27 @@ void cThrownEnderPearlEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cThrownEnderPearlEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
||||||
|
{
|
||||||
|
if (m_DestroyTimer > 0)
|
||||||
|
{
|
||||||
|
m_DestroyTimer--;
|
||||||
|
if (m_DestroyTimer == 0)
|
||||||
|
{
|
||||||
|
Destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
super::Tick(a_Dt, a_Chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cThrownEnderPearlEntity::TeleportCreator(const Vector3d & a_HitPos)
|
void cThrownEnderPearlEntity::TeleportCreator(const Vector3d & a_HitPos)
|
||||||
{
|
{
|
||||||
if (m_CreatorData.m_Name.empty())
|
if (m_CreatorData.m_Name.empty())
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// ThrownEnderPearlEntity.h
|
// ThrownEnderPearlEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cThrownEnderPeralEntity class representing an ender pearl being thrown
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -29,23 +34,8 @@ protected:
|
||||||
|
|
||||||
// cProjectileEntity overrides:
|
// cProjectileEntity overrides:
|
||||||
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
||||||
virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
virtual void OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
||||||
virtual void Tick (float a_Dt, cChunk & a_Chunk) override
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
||||||
{
|
|
||||||
if (m_DestroyTimer > 0)
|
|
||||||
{
|
|
||||||
m_DestroyTimer--;
|
|
||||||
if (m_DestroyTimer == 0)
|
|
||||||
{
|
|
||||||
Destroy();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
super::Tick(a_Dt, a_Chunk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Teleports the creator where the ender pearl lands */
|
/** Teleports the creator where the ender pearl lands */
|
||||||
void TeleportCreator(const Vector3d & a_HitPos);
|
void TeleportCreator(const Vector3d & a_HitPos);
|
||||||
|
@ -56,3 +46,7 @@ private:
|
||||||
int m_DestroyTimer;
|
int m_DestroyTimer;
|
||||||
|
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -43,3 +43,28 @@ void cThrownSnowballEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d &
|
||||||
|
|
||||||
m_DestroyTimer = 5;
|
m_DestroyTimer = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cThrownSnowballEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
||||||
|
{
|
||||||
|
if (m_DestroyTimer > 0)
|
||||||
|
{
|
||||||
|
m_DestroyTimer--;
|
||||||
|
if (m_DestroyTimer == 0)
|
||||||
|
{
|
||||||
|
Destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
super::Tick(a_Dt, a_Chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
//
|
|
||||||
// ThrownSnowballEntity.h
|
// ThrownSnowballEntity.h
|
||||||
//
|
|
||||||
|
// Declares the cThrownSnowballEntity representing a snowball that has been thrown
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -29,23 +34,8 @@ protected:
|
||||||
|
|
||||||
// cProjectileEntity overrides:
|
// cProjectileEntity overrides:
|
||||||
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
||||||
virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
virtual void OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
||||||
virtual void Tick (float a_Dt, cChunk & a_Chunk) override
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
||||||
{
|
|
||||||
if (m_DestroyTimer > 0)
|
|
||||||
{
|
|
||||||
m_DestroyTimer--;
|
|
||||||
if (m_DestroyTimer == 0)
|
|
||||||
{
|
|
||||||
Destroy();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
super::Tick(a_Dt, a_Chunk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -53,3 +43,7 @@ private:
|
||||||
int m_DestroyTimer;
|
int m_DestroyTimer;
|
||||||
|
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
|
|
||||||
// WitherSkullEntity.h
|
// WitherSkullEntity.h
|
||||||
|
|
||||||
// Declares the cWitherSkullEntity class representing the entity used by both blue and black wither skulls
|
// Declares the cWitherSkullEntity class representing the entity used by both blue and black wither skulls
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ProjectileEntity.h"
|
#include "ProjectileEntity.h"
|
||||||
|
@ -30,6 +34,10 @@ protected:
|
||||||
|
|
||||||
// cProjectileEntity overrides:
|
// cProjectileEntity overrides:
|
||||||
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
||||||
virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
virtual void OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
||||||
|
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -119,9 +119,9 @@ cTerrainCompositionGenPtr cTerrainCompositionGen::CreateCompositionGen(cIniFile
|
||||||
|
|
||||||
cComposableGenerator::cComposableGenerator(cChunkGenerator & a_ChunkGenerator) :
|
cComposableGenerator::cComposableGenerator(cChunkGenerator & a_ChunkGenerator) :
|
||||||
super(a_ChunkGenerator),
|
super(a_ChunkGenerator),
|
||||||
m_BiomeGen(nullptr),
|
m_BiomeGen(),
|
||||||
m_HeightGen(nullptr),
|
m_HeightGen(),
|
||||||
m_CompositionGen(nullptr)
|
m_CompositionGen()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -572,6 +572,8 @@ bool cItemHandler::CanHarvestBlock(BLOCKTYPE a_BlockType)
|
||||||
case E_BLOCK_COBBLESTONE:
|
case E_BLOCK_COBBLESTONE:
|
||||||
case E_BLOCK_COBBLESTONE_STAIRS:
|
case E_BLOCK_COBBLESTONE_STAIRS:
|
||||||
case E_BLOCK_COBBLESTONE_WALL:
|
case E_BLOCK_COBBLESTONE_WALL:
|
||||||
|
case E_BLOCK_COBWEB:
|
||||||
|
case E_BLOCK_DEAD_BUSH:
|
||||||
case E_BLOCK_DIAMOND_BLOCK:
|
case E_BLOCK_DIAMOND_BLOCK:
|
||||||
case E_BLOCK_DIAMOND_ORE:
|
case E_BLOCK_DIAMOND_ORE:
|
||||||
case E_BLOCK_DOUBLE_NEW_STONE_SLAB:
|
case E_BLOCK_DOUBLE_NEW_STONE_SLAB:
|
||||||
|
|
|
@ -28,21 +28,25 @@ public:
|
||||||
|
|
||||||
virtual bool OnDiggingBlock(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 OnDiggingBlock(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override
|
||||||
{
|
{
|
||||||
BLOCKTYPE Block = a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
BLOCKTYPE Block;
|
||||||
|
NIBBLETYPE BlockMeta;
|
||||||
|
a_World->GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, Block, BlockMeta);
|
||||||
|
|
||||||
if ((Block == E_BLOCK_LEAVES) || (Block == E_BLOCK_NEW_LEAVES))
|
if ((Block == E_BLOCK_LEAVES) || (Block == E_BLOCK_NEW_LEAVES))
|
||||||
{
|
{
|
||||||
NIBBLETYPE Meta = a_World->GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
cItems Drops;
|
||||||
cBlockHandler * Handler = cBlockInfo::GetHandler(Block);
|
cBlockHandler * Handler = cBlockInfo::GetHandler(Block);
|
||||||
|
|
||||||
cItems Drops;
|
Handler->ConvertToPickups(Drops, BlockMeta);
|
||||||
Handler->ConvertToPickups(Drops, Meta);
|
Drops.Add(Block, 1, BlockMeta & 3);
|
||||||
Drops.push_back(cItem(Block, 1, Meta & 3));
|
|
||||||
a_World->SpawnItemPickups(Drops, a_BlockX, a_BlockY, a_BlockZ);
|
a_World->SpawnItemPickups(Drops, a_BlockX, a_BlockY, a_BlockZ);
|
||||||
|
|
||||||
a_World->SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_AIR, 0);
|
a_World->SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_AIR, 0);
|
||||||
|
a_World->SpawnItemPickups(Drops, a_BlockX, a_BlockY, a_BlockZ);
|
||||||
a_Player->UseEquippedItem();
|
a_Player->UseEquippedItem();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,12 +57,10 @@ public:
|
||||||
{
|
{
|
||||||
case E_BLOCK_COBWEB:
|
case E_BLOCK_COBWEB:
|
||||||
case E_BLOCK_VINES:
|
case E_BLOCK_VINES:
|
||||||
case E_BLOCK_LEAVES:
|
|
||||||
case E_BLOCK_NEW_LEAVES:
|
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} // switch (a_BlockType)
|
}
|
||||||
return super::CanHarvestBlock(a_BlockType);
|
return super::CanHarvestBlock(a_BlockType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,12 +73,21 @@ public:
|
||||||
|
|
||||||
virtual void OnBlockDestroyed(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ) override
|
virtual void OnBlockDestroyed(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ) override
|
||||||
{
|
{
|
||||||
super::OnBlockDestroyed(a_World, a_Player, a_Item, a_BlockX, a_BlockY, a_BlockZ);
|
BLOCKTYPE Block;
|
||||||
|
NIBBLETYPE BlockMeta;
|
||||||
|
a_World->GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, Block, BlockMeta);
|
||||||
|
|
||||||
BLOCKTYPE Block = a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
super::OnBlockDestroyed(a_World, a_Player, a_Item, a_BlockX, a_BlockY, a_BlockZ);
|
||||||
if ((Block == E_BLOCK_TRIPWIRE) || (Block == E_BLOCK_VINES))
|
switch (Block)
|
||||||
{
|
{
|
||||||
a_Player->UseEquippedItem();
|
case E_BLOCK_COBWEB:
|
||||||
|
case E_BLOCK_DEAD_BUSH:
|
||||||
|
case E_BLOCK_TRIPWIRE:
|
||||||
|
case E_BLOCK_VINES:
|
||||||
|
case E_BLOCK_WOOL:
|
||||||
|
{
|
||||||
|
a_Player->UseEquippedItem();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
|
@ -35,12 +35,12 @@ public:
|
||||||
mfNoSpawn,
|
mfNoSpawn,
|
||||||
mfUnhandled, // Nothing. Be sure this is the last and the others are in order
|
mfUnhandled, // Nothing. Be sure this is the last and the others are in order
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
enum MState{ATTACKING, IDLE, CHASING, ESCAPING} m_EMState;
|
enum MState{ATTACKING, IDLE, CHASING, ESCAPING} m_EMState;
|
||||||
enum MPersonality{PASSIVE, AGGRESSIVE, COWARDLY} m_EMPersonality;
|
enum MPersonality{PASSIVE, AGGRESSIVE, COWARDLY} m_EMPersonality;
|
||||||
|
|
||||||
/** Creates the mob object.
|
/** Creates the mob object.
|
||||||
If a_ConfigName is not empty, the configuration is loaded using GetMonsterConfig()
|
If a_ConfigName is not empty, the configuration is loaded using GetMonsterConfig()
|
||||||
a_MobType is the type of the mob (also used in the protocol ( http://wiki.vg/Entities#Mobs 2012_12_22))
|
a_MobType is the type of the mob (also used in the protocol ( http://wiki.vg/Entities#Mobs 2012_12_22))
|
||||||
|
@ -49,47 +49,47 @@ public:
|
||||||
cMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height);
|
cMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height);
|
||||||
|
|
||||||
CLASS_PROTODEF(cMonster)
|
CLASS_PROTODEF(cMonster)
|
||||||
|
|
||||||
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
||||||
|
|
||||||
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
||||||
|
|
||||||
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
|
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
|
||||||
|
|
||||||
virtual void KilledBy(TakeDamageInfo & a_TDI) override;
|
virtual void KilledBy(TakeDamageInfo & a_TDI) override;
|
||||||
|
|
||||||
virtual void OnRightClicked(cPlayer & a_Player) override;
|
virtual void OnRightClicked(cPlayer & a_Player) override;
|
||||||
|
|
||||||
virtual void MoveToPosition(const Vector3d & a_Position); // tolua_export
|
virtual void MoveToPosition(const Vector3d & a_Position); // tolua_export
|
||||||
virtual bool ReachedDestination(void);
|
virtual bool ReachedDestination(void);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
eMonsterType GetMobType(void) const {return m_MobType; }
|
eMonsterType GetMobType(void) const {return m_MobType; }
|
||||||
eFamily GetMobFamily(void) const;
|
eFamily GetMobFamily(void) const;
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
virtual void CheckEventSeePlayer(void);
|
virtual void CheckEventSeePlayer(void);
|
||||||
virtual void EventSeePlayer(cEntity * a_Player);
|
virtual void EventSeePlayer(cEntity * a_Player);
|
||||||
|
|
||||||
/// Reads the monster configuration for the specified monster name and assigns it to this object.
|
/// Reads the monster configuration for the specified monster name and assigns it to this object.
|
||||||
void GetMonsterConfig(const AString & a_Name);
|
void GetMonsterConfig(const AString & a_Name);
|
||||||
|
|
||||||
/** Returns whether this mob is undead (skeleton, zombie, etc.) */
|
/** Returns whether this mob is undead (skeleton, zombie, etc.) */
|
||||||
virtual bool IsUndead(void);
|
virtual bool IsUndead(void);
|
||||||
|
|
||||||
virtual void EventLosePlayer(void);
|
virtual void EventLosePlayer(void);
|
||||||
virtual void CheckEventLostPlayer(void);
|
virtual void CheckEventLostPlayer(void);
|
||||||
|
|
||||||
virtual void InStateIdle (float a_Dt);
|
virtual void InStateIdle (float a_Dt);
|
||||||
virtual void InStateChasing (float a_Dt);
|
virtual void InStateChasing (float a_Dt);
|
||||||
virtual void InStateEscaping(float a_Dt);
|
virtual void InStateEscaping(float a_Dt);
|
||||||
|
|
||||||
int GetAttackRate() { return (int)m_AttackRate; }
|
int GetAttackRate() { return static_cast<int>(m_AttackRate); }
|
||||||
void SetAttackRate(float a_AttackRate) { m_AttackRate = a_AttackRate; }
|
void SetAttackRate(float a_AttackRate) { m_AttackRate = a_AttackRate; }
|
||||||
void SetAttackRange(int a_AttackRange) { m_AttackRange = a_AttackRange; }
|
void SetAttackRange(int a_AttackRange) { m_AttackRange = a_AttackRange; }
|
||||||
void SetAttackDamage(int a_AttackDamage) { m_AttackDamage = a_AttackDamage; }
|
void SetAttackDamage(int a_AttackDamage) { m_AttackDamage = a_AttackDamage; }
|
||||||
void SetSightDistance(int a_SightDistance) { m_SightDistance = a_SightDistance; }
|
void SetSightDistance(int a_SightDistance) { m_SightDistance = a_SightDistance; }
|
||||||
|
|
||||||
float GetDropChanceWeapon() { return m_DropChanceWeapon; }
|
float GetDropChanceWeapon() { return m_DropChanceWeapon; }
|
||||||
float GetDropChanceHelmet() { return m_DropChanceHelmet; }
|
float GetDropChanceHelmet() { return m_DropChanceHelmet; }
|
||||||
float GetDropChanceChestplate() { return m_DropChanceChestplate; }
|
float GetDropChanceChestplate() { return m_DropChanceChestplate; }
|
||||||
|
@ -102,7 +102,7 @@ public:
|
||||||
void SetDropChanceLeggings(float a_DropChanceLeggings) { m_DropChanceLeggings = a_DropChanceLeggings; }
|
void SetDropChanceLeggings(float a_DropChanceLeggings) { m_DropChanceLeggings = a_DropChanceLeggings; }
|
||||||
void SetDropChanceBoots(float a_DropChanceBoots) { m_DropChanceBoots = a_DropChanceBoots; }
|
void SetDropChanceBoots(float a_DropChanceBoots) { m_DropChanceBoots = a_DropChanceBoots; }
|
||||||
void SetCanPickUpLoot(bool a_CanPickUpLoot) { m_CanPickUpLoot = a_CanPickUpLoot; }
|
void SetCanPickUpLoot(bool a_CanPickUpLoot) { m_CanPickUpLoot = a_CanPickUpLoot; }
|
||||||
|
|
||||||
/// Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick
|
/// Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick
|
||||||
void SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; }
|
void SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; }
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ public:
|
||||||
virtual bool IsBaby (void) const { return false; }
|
virtual bool IsBaby (void) const { return false; }
|
||||||
virtual bool IsTame (void) const { return false; }
|
virtual bool IsTame (void) const { return false; }
|
||||||
virtual bool IsSitting (void) const { return false; }
|
virtual bool IsSitting (void) const { return false; }
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/** Returns true if the monster has a custom name. */
|
/** Returns true if the monster has a custom name. */
|
||||||
|
@ -135,10 +135,10 @@ public:
|
||||||
|
|
||||||
/// Translates MobType enum to a string, empty string if unknown
|
/// Translates MobType enum to a string, empty string if unknown
|
||||||
static AString MobTypeToString(eMonsterType a_MobType);
|
static AString MobTypeToString(eMonsterType a_MobType);
|
||||||
|
|
||||||
/// Translates MobType string to the enum, mtInvalidType if not recognized
|
/// Translates MobType string to the enum, mtInvalidType if not recognized
|
||||||
static eMonsterType StringToMobType(const AString & a_MobTypeName);
|
static eMonsterType StringToMobType(const AString & a_MobTypeName);
|
||||||
|
|
||||||
/// Returns the mob family based on the type
|
/// Returns the mob family based on the type
|
||||||
static eFamily FamilyFromType(eMonsterType a_MobType);
|
static eFamily FamilyFromType(eMonsterType a_MobType);
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ public:
|
||||||
static int GetSpawnDelay(cMonster::eFamily a_MobFamily);
|
static int GetSpawnDelay(cMonster::eFamily a_MobFamily);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/** Creates a new object of the specified mob.
|
/** Creates a new object of the specified mob.
|
||||||
a_MobType is the type of the mob to be created
|
a_MobType is the type of the mob to be created
|
||||||
Asserts and returns null if mob type is not specified
|
Asserts and returns null if mob type is not specified
|
||||||
|
@ -154,7 +154,7 @@ public:
|
||||||
static cMonster * NewMonsterFromType(eMonsterType a_MobType);
|
static cMonster * NewMonsterFromType(eMonsterType a_MobType);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/* ======= PATHFINDING ======= */
|
/* ======= PATHFINDING ======= */
|
||||||
|
|
||||||
/** A pointer to the entity this mobile is aiming to reach */
|
/** A pointer to the entity this mobile is aiming to reach */
|
||||||
|
@ -168,7 +168,7 @@ protected:
|
||||||
|
|
||||||
/** Stores if mobile is currently moving towards the ultimate, final destination */
|
/** Stores if mobile is currently moving towards the ultimate, final destination */
|
||||||
bool m_bMovingToDestination;
|
bool m_bMovingToDestination;
|
||||||
|
|
||||||
/** Finds the first non-air block position (not the highest, as cWorld::GetHeight does)
|
/** Finds the first non-air block position (not the highest, as cWorld::GetHeight does)
|
||||||
If current Y is nonsolid, goes down to try to find a solid block, then returns that + 1
|
If current Y is nonsolid, goes down to try to find a solid block, then returns that + 1
|
||||||
If current Y is solid, goes up to find first nonsolid block, and returns that */
|
If current Y is solid, goes up to find first nonsolid block, and returns that */
|
||||||
|
@ -227,14 +227,14 @@ protected:
|
||||||
int m_AttackRange;
|
int m_AttackRange;
|
||||||
float m_AttackInterval;
|
float m_AttackInterval;
|
||||||
int m_SightDistance;
|
int m_SightDistance;
|
||||||
|
|
||||||
float m_DropChanceWeapon;
|
float m_DropChanceWeapon;
|
||||||
float m_DropChanceHelmet;
|
float m_DropChanceHelmet;
|
||||||
float m_DropChanceChestplate;
|
float m_DropChanceChestplate;
|
||||||
float m_DropChanceLeggings;
|
float m_DropChanceLeggings;
|
||||||
float m_DropChanceBoots;
|
float m_DropChanceBoots;
|
||||||
bool m_CanPickUpLoot;
|
bool m_CanPickUpLoot;
|
||||||
|
|
||||||
void HandleDaylightBurning(cChunk & a_Chunk);
|
void HandleDaylightBurning(cChunk & a_Chunk);
|
||||||
bool m_BurnsInDaylight;
|
bool m_BurnsInDaylight;
|
||||||
|
|
||||||
|
@ -242,22 +242,18 @@ protected:
|
||||||
|
|
||||||
/** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops*/
|
/** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops*/
|
||||||
void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0);
|
void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0);
|
||||||
|
|
||||||
/** Adds a item a_Item with the chance of a_Chance (in percent) to itemdrops a_Drops*/
|
/** Adds a item a_Item with the chance of a_Chance (in percent) to itemdrops a_Drops*/
|
||||||
void AddRandomUncommonDropItem(cItems & a_Drops, float a_Chance, short a_Item, short a_ItemHealth = 0);
|
void AddRandomUncommonDropItem(cItems & a_Drops, float a_Chance, short a_Item, short a_ItemHealth = 0);
|
||||||
|
|
||||||
/** Adds one rare item out of the list of rare items a_Items modified by the looting level a_LootingLevel(I-III or custom) to the itemdrop a_Drops*/
|
/** Adds one rare item out of the list of rare items a_Items modified by the looting level a_LootingLevel(I-III or custom) to the itemdrop a_Drops*/
|
||||||
void AddRandomRareDropItem(cItems & a_Drops, cItems & a_Items, short a_LootingLevel);
|
void AddRandomRareDropItem(cItems & a_Drops, cItems & a_Items, short a_LootingLevel);
|
||||||
|
|
||||||
/** Adds armor that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if piccked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop*/
|
/** Adds armor that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if piccked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop*/
|
||||||
void AddRandomArmorDropItem(cItems & a_Drops, short a_LootingLevel);
|
void AddRandomArmorDropItem(cItems & a_Drops, short a_LootingLevel);
|
||||||
|
|
||||||
/** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if piccked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop*/
|
/** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if piccked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop*/
|
||||||
void AddRandomWeaponDropItem(cItems & a_Drops, short a_LootingLevel);
|
void AddRandomWeaponDropItem(cItems & a_Drops, short a_LootingLevel);
|
||||||
|
|
||||||
|
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,17 +31,17 @@ protected:
|
||||||
|
|
||||||
/// The overriden Execute() method should check this value periodically and terminate if this is true
|
/// The overriden Execute() method should check this value periodically and terminate if this is true
|
||||||
volatile bool m_ShouldTerminate;
|
volatile bool m_ShouldTerminate;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cIsThread(const AString & a_ThreadName);
|
cIsThread(const AString & a_ThreadName);
|
||||||
virtual ~cIsThread();
|
virtual ~cIsThread();
|
||||||
|
|
||||||
/// Starts the thread; returns without waiting for the actual start
|
/// Starts the thread; returns without waiting for the actual start
|
||||||
bool Start(void);
|
bool Start(void);
|
||||||
|
|
||||||
/// Signals the thread to terminate and waits until it's finished
|
/// Signals the thread to terminate and waits until it's finished
|
||||||
void Stop(void);
|
void Stop(void);
|
||||||
|
|
||||||
/// Waits for the thread to finish. Doesn't signalize the ShouldTerminate flag
|
/// Waits for the thread to finish. Doesn't signalize the ShouldTerminate flag
|
||||||
bool Wait(void);
|
bool Wait(void);
|
||||||
|
|
||||||
|
@ -58,7 +58,3 @@ protected:
|
||||||
|
|
||||||
|
|
||||||
#endif // CISTHREAD_H_INCLUDED
|
#endif // CISTHREAD_H_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2803,7 +2803,7 @@ void cProtocol172::cPacketizer::WriteEntityMetadata(const cEntity & a_Entity)
|
||||||
WriteByte(0xA2);
|
WriteByte(0xA2);
|
||||||
WriteItem(Frame.GetItem());
|
WriteItem(Frame.GetItem());
|
||||||
WriteByte(0x3);
|
WriteByte(0x3);
|
||||||
WriteByte(Frame.GetRotation() / 2);
|
WriteByte(Frame.GetItemRotation() / 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: break;
|
default: break;
|
||||||
|
|
|
@ -3109,7 +3109,7 @@ void cProtocol180::cPacketizer::WriteEntityMetadata(const cEntity & a_Entity)
|
||||||
WriteByte(0xA8);
|
WriteByte(0xA8);
|
||||||
WriteItem(Frame.GetItem());
|
WriteItem(Frame.GetItem());
|
||||||
WriteByte(0x09);
|
WriteByte(0x09);
|
||||||
WriteByte(Frame.GetRotation());
|
WriteByte(Frame.GetItemRotation());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: break;
|
default: break;
|
||||||
|
|
|
@ -2321,7 +2321,7 @@ cItem * cSlotAreaTemporary::GetPlayerSlots(cPlayer & a_Player)
|
||||||
if (itr == m_Items.end())
|
if (itr == m_Items.end())
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return itr->second.data();
|
return itr->second.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -685,21 +685,21 @@ void cNBTChunkSerializer::AddProjectileEntity(cProjectileEntity * a_Projectile)
|
||||||
|
|
||||||
void cNBTChunkSerializer::AddHangingEntity(cHangingEntity * a_Hanging)
|
void cNBTChunkSerializer::AddHangingEntity(cHangingEntity * a_Hanging)
|
||||||
{
|
{
|
||||||
m_Writer.AddByte("Direction", (unsigned char)a_Hanging->GetDirection());
|
m_Writer.AddInt("TileX", a_Hanging->GetBlockX());
|
||||||
m_Writer.AddInt("TileX", a_Hanging->GetTileX());
|
m_Writer.AddInt("TileY", a_Hanging->GetBlockY());
|
||||||
m_Writer.AddInt("TileY", a_Hanging->GetTileY());
|
m_Writer.AddInt("TileZ", a_Hanging->GetBlockZ());
|
||||||
m_Writer.AddInt("TileZ", a_Hanging->GetTileZ());
|
switch (a_Hanging->GetFacing())
|
||||||
switch (a_Hanging->GetDirection())
|
|
||||||
{
|
{
|
||||||
case BLOCK_FACE_YM: m_Writer.AddByte("Dir", (unsigned char)2); break;
|
case BLOCK_FACE_XM: m_Writer.AddByte("Facing", 1); break;
|
||||||
case BLOCK_FACE_YP: m_Writer.AddByte("Dir", (unsigned char)1); break;
|
case BLOCK_FACE_XP: m_Writer.AddByte("Facing", 3); break;
|
||||||
case BLOCK_FACE_ZM: m_Writer.AddByte("Dir", (unsigned char)0); break;
|
case BLOCK_FACE_ZM: m_Writer.AddByte("Facing", 2); break;
|
||||||
case BLOCK_FACE_ZP: m_Writer.AddByte("Dir", (unsigned char)3); break;
|
case BLOCK_FACE_ZP: m_Writer.AddByte("Facing", 0); break;
|
||||||
|
|
||||||
case BLOCK_FACE_XM:
|
case BLOCK_FACE_YM:
|
||||||
case BLOCK_FACE_XP:
|
case BLOCK_FACE_YP:
|
||||||
case BLOCK_FACE_NONE:
|
case BLOCK_FACE_NONE:
|
||||||
{
|
{
|
||||||
|
// These directions are invalid, but they may have been previously loaded, so keep them.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -740,7 +740,7 @@ void cNBTChunkSerializer::AddItemFrameEntity(cItemFrame * a_ItemFrame)
|
||||||
AddBasicEntity(a_ItemFrame, "ItemFrame");
|
AddBasicEntity(a_ItemFrame, "ItemFrame");
|
||||||
AddHangingEntity(a_ItemFrame);
|
AddHangingEntity(a_ItemFrame);
|
||||||
AddItem(a_ItemFrame->GetItem(), -1, "Item");
|
AddItem(a_ItemFrame->GetItem(), -1, "Item");
|
||||||
m_Writer.AddByte("ItemRotation", (unsigned char)a_ItemFrame->GetRotation());
|
m_Writer.AddByte("ItemRotation", (unsigned char)a_ItemFrame->GetItemRotation());
|
||||||
m_Writer.AddFloat("ItemDropChance", 1.0F);
|
m_Writer.AddFloat("ItemDropChance", 1.0F);
|
||||||
m_Writer.EndCompound();
|
m_Writer.EndCompound();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1660,30 +1660,41 @@ void cWSSAnvil::LoadExpOrbFromNBT(cEntityList & a_Entities, const cParsedNBT & a
|
||||||
|
|
||||||
void cWSSAnvil::LoadHangingFromNBT(cHangingEntity & a_Hanging, const cParsedNBT & a_NBT, int a_TagIdx)
|
void cWSSAnvil::LoadHangingFromNBT(cHangingEntity & a_Hanging, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||||
{
|
{
|
||||||
int Direction = a_NBT.FindChildByName(a_TagIdx, "Direction");
|
// "Facing" tag is the prime source of the Facing; if not available, translate from older "Direction" or "Dir"
|
||||||
if (Direction > 0)
|
int Facing = a_NBT.FindChildByName(a_TagIdx, "Facing");
|
||||||
|
if (Facing > 0)
|
||||||
{
|
{
|
||||||
Direction = (int)a_NBT.GetByte(Direction);
|
Facing = (int)a_NBT.GetByte(Facing);
|
||||||
if ((Direction < 2) || (Direction > 5))
|
if ((Facing >= 2) && (Facing <= 5))
|
||||||
{
|
{
|
||||||
a_Hanging.SetDirection(BLOCK_FACE_NORTH);
|
a_Hanging.SetFacing(static_cast<eBlockFace>(Facing));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
a_Hanging.SetDirection(static_cast<eBlockFace>(Direction));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Direction = a_NBT.FindChildByName(a_TagIdx, "Dir");
|
Facing = a_NBT.FindChildByName(a_TagIdx, "Direction");
|
||||||
if (Direction > 0)
|
if (Facing > 0)
|
||||||
{
|
{
|
||||||
switch ((int)a_NBT.GetByte(Direction))
|
switch ((int)a_NBT.GetByte(Facing))
|
||||||
{
|
{
|
||||||
case 0: a_Hanging.SetDirection(BLOCK_FACE_NORTH); break;
|
case 0: a_Hanging.SetFacing(BLOCK_FACE_ZM); break;
|
||||||
case 1: a_Hanging.SetDirection(BLOCK_FACE_TOP); break;
|
case 1: a_Hanging.SetFacing(BLOCK_FACE_XM); break;
|
||||||
case 2: a_Hanging.SetDirection(BLOCK_FACE_BOTTOM); break;
|
case 2: a_Hanging.SetFacing(BLOCK_FACE_ZP); break;
|
||||||
case 3: a_Hanging.SetDirection(BLOCK_FACE_SOUTH); break;
|
case 3: a_Hanging.SetFacing(BLOCK_FACE_XP); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Facing = a_NBT.FindChildByName(a_TagIdx, "Dir"); // Has values 0 and 2 swapped
|
||||||
|
if (Facing > 0)
|
||||||
|
{
|
||||||
|
switch ((int)a_NBT.GetByte(Facing))
|
||||||
|
{
|
||||||
|
case 0: a_Hanging.SetFacing(BLOCK_FACE_ZP); break;
|
||||||
|
case 1: a_Hanging.SetFacing(BLOCK_FACE_XM); break;
|
||||||
|
case 2: a_Hanging.SetFacing(BLOCK_FACE_ZM); break;
|
||||||
|
case 3: a_Hanging.SetFacing(BLOCK_FACE_XP); break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1732,7 +1743,7 @@ void cWSSAnvil::LoadItemFrameFromNBT(cEntityList & a_Entities, const cParsedNBT
|
||||||
int Rotation = a_NBT.FindChildByName(a_TagIdx, "ItemRotation");
|
int Rotation = a_NBT.FindChildByName(a_TagIdx, "ItemRotation");
|
||||||
if (Rotation > 0)
|
if (Rotation > 0)
|
||||||
{
|
{
|
||||||
ItemFrame->SetRotation((Byte)a_NBT.GetByte(Rotation));
|
ItemFrame->SetItemRotation((Byte)a_NBT.GetByte(Rotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
a_Entities.push_back(ItemFrame.release());
|
a_Entities.push_back(ItemFrame.release());
|
||||||
|
|
Loading…
Reference in New Issue
Block a user