mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 01:53:45 +01:00
scriptapi: Sort out ServerEnvironment / Environment distinction properly
The API implementation is shared between CSM and SSM. Functions should retrieve a plain env when they do not need any server-specific functions.
This commit is contained in:
parent
f105bc8dc2
commit
054c5dfaa3
@ -83,6 +83,24 @@ float Environment::getTimeOfDayF()
|
|||||||
return m_time_of_day_f;
|
return m_time_of_day_f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Environment::line_of_sight(v3f pos1, v3f pos2, v3s16 *p)
|
||||||
|
{
|
||||||
|
// Iterate trough nodes on the line
|
||||||
|
voxalgo::VoxelLineIterator iterator(pos1 / BS, (pos2 - pos1) / BS);
|
||||||
|
do {
|
||||||
|
MapNode n = getMap().getNode(iterator.m_current_node_pos);
|
||||||
|
|
||||||
|
// Return non-air
|
||||||
|
if (n.param0 != CONTENT_AIR) {
|
||||||
|
if (p)
|
||||||
|
*p = iterator.m_current_node_pos;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
iterator.next();
|
||||||
|
} while (iterator.m_current_index <= iterator.m_last_index);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check if a node is pointable
|
Check if a node is pointable
|
||||||
*/
|
*/
|
||||||
|
@ -76,6 +76,16 @@ public:
|
|||||||
|
|
||||||
u32 getDayCount();
|
u32 getDayCount();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns false if the given line intersects with a
|
||||||
|
* non-air node, true otherwise.
|
||||||
|
* \param pos1 start of the line
|
||||||
|
* \param pos2 end of the line
|
||||||
|
* \param p output, position of the first non-air node
|
||||||
|
* the line intersects
|
||||||
|
*/
|
||||||
|
bool line_of_sight(v3f pos1, v3f pos2, v3s16 *p = nullptr);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Gets the objects pointed by the shootline as
|
* Gets the objects pointed by the shootline as
|
||||||
* pointed things.
|
* pointed things.
|
||||||
|
@ -139,8 +139,7 @@ void LuaLBM::trigger(ServerEnvironment *env, v3s16 p, MapNode n)
|
|||||||
|
|
||||||
int LuaRaycast::l_next(lua_State *L)
|
int LuaRaycast::l_next(lua_State *L)
|
||||||
{
|
{
|
||||||
MAP_LOCK_REQUIRED;
|
GET_PLAIN_ENV_PTR;
|
||||||
GET_ENV_PTR;
|
|
||||||
|
|
||||||
bool csm = false;
|
bool csm = false;
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
@ -384,7 +383,7 @@ int ModApiEnvMod::l_get_node_or_nil(lua_State *L)
|
|||||||
// timeofday: nil = current time, 0 = night, 0.5 = day
|
// timeofday: nil = current time, 0 = night, 0.5 = day
|
||||||
int ModApiEnvMod::l_get_node_light(lua_State *L)
|
int ModApiEnvMod::l_get_node_light(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_PLAIN_ENV_PTR;
|
||||||
|
|
||||||
// Do it
|
// Do it
|
||||||
v3s16 pos = read_v3s16(L, 1);
|
v3s16 pos = read_v3s16(L, 1);
|
||||||
@ -488,10 +487,7 @@ int ModApiEnvMod::l_punch_node(lua_State *L)
|
|||||||
// pos = {x=num, y=num, z=num}
|
// pos = {x=num, y=num, z=num}
|
||||||
int ModApiEnvMod::l_get_node_max_level(lua_State *L)
|
int ModApiEnvMod::l_get_node_max_level(lua_State *L)
|
||||||
{
|
{
|
||||||
Environment *env = getEnv(L);
|
GET_PLAIN_ENV_PTR;
|
||||||
if (!env) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
v3s16 pos = read_v3s16(L, 1);
|
v3s16 pos = read_v3s16(L, 1);
|
||||||
MapNode n = env->getMap().getNode(pos);
|
MapNode n = env->getMap().getNode(pos);
|
||||||
@ -503,10 +499,7 @@ int ModApiEnvMod::l_get_node_max_level(lua_State *L)
|
|||||||
// pos = {x=num, y=num, z=num}
|
// pos = {x=num, y=num, z=num}
|
||||||
int ModApiEnvMod::l_get_node_level(lua_State *L)
|
int ModApiEnvMod::l_get_node_level(lua_State *L)
|
||||||
{
|
{
|
||||||
Environment *env = getEnv(L);
|
GET_PLAIN_ENV_PTR;
|
||||||
if (!env) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
v3s16 pos = read_v3s16(L, 1);
|
v3s16 pos = read_v3s16(L, 1);
|
||||||
MapNode n = env->getMap().getNode(pos);
|
MapNode n = env->getMap().getNode(pos);
|
||||||
@ -551,7 +544,7 @@ int ModApiEnvMod::l_add_node_level(lua_State *L)
|
|||||||
// find_nodes_with_meta(pos1, pos2)
|
// find_nodes_with_meta(pos1, pos2)
|
||||||
int ModApiEnvMod::l_find_nodes_with_meta(lua_State *L)
|
int ModApiEnvMod::l_find_nodes_with_meta(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_PLAIN_ENV_PTR;
|
||||||
|
|
||||||
std::vector<v3s16> positions = env->getMap().findNodesWithMetadata(
|
std::vector<v3s16> positions = env->getMap().findNodesWithMetadata(
|
||||||
check_v3s16(L, 1), check_v3s16(L, 2));
|
check_v3s16(L, 1), check_v3s16(L, 2));
|
||||||
@ -728,10 +721,7 @@ int ModApiEnvMod::l_set_timeofday(lua_State *L)
|
|||||||
// get_timeofday() -> 0...1
|
// get_timeofday() -> 0...1
|
||||||
int ModApiEnvMod::l_get_timeofday(lua_State *L)
|
int ModApiEnvMod::l_get_timeofday(lua_State *L)
|
||||||
{
|
{
|
||||||
Environment *env = getEnv(L);
|
GET_PLAIN_ENV_PTR;
|
||||||
if (!env) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do it
|
// Do it
|
||||||
int timeofday_mh = env->getTimeOfDay();
|
int timeofday_mh = env->getTimeOfDay();
|
||||||
@ -743,10 +733,7 @@ int ModApiEnvMod::l_get_timeofday(lua_State *L)
|
|||||||
// get_day_count() -> int
|
// get_day_count() -> int
|
||||||
int ModApiEnvMod::l_get_day_count(lua_State *L)
|
int ModApiEnvMod::l_get_day_count(lua_State *L)
|
||||||
{
|
{
|
||||||
Environment *env = getEnv(L);
|
GET_PLAIN_ENV_PTR;
|
||||||
if (!env) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
lua_pushnumber(L, env->getDayCount());
|
lua_pushnumber(L, env->getDayCount());
|
||||||
return 1;
|
return 1;
|
||||||
@ -767,12 +754,9 @@ int ModApiEnvMod::l_get_gametime(lua_State *L)
|
|||||||
// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
|
// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
|
||||||
int ModApiEnvMod::l_find_node_near(lua_State *L)
|
int ModApiEnvMod::l_find_node_near(lua_State *L)
|
||||||
{
|
{
|
||||||
Environment *env = getEnv(L);
|
GET_PLAIN_ENV_PTR;
|
||||||
if (!env) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NodeDefManager *ndef = getGameDef(L)->ndef();
|
const NodeDefManager *ndef = env->getGameDef()->ndef();
|
||||||
v3s16 pos = read_v3s16(L, 1);
|
v3s16 pos = read_v3s16(L, 1);
|
||||||
int radius = luaL_checkinteger(L, 2);
|
int radius = luaL_checkinteger(L, 2);
|
||||||
std::vector<content_t> filter;
|
std::vector<content_t> filter;
|
||||||
@ -815,20 +799,19 @@ int ModApiEnvMod::l_find_node_near(lua_State *L)
|
|||||||
// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
|
// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
|
||||||
int ModApiEnvMod::l_find_nodes_in_area(lua_State *L)
|
int ModApiEnvMod::l_find_nodes_in_area(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_PLAIN_ENV_PTR;
|
||||||
|
|
||||||
v3s16 minp = read_v3s16(L, 1);
|
v3s16 minp = read_v3s16(L, 1);
|
||||||
v3s16 maxp = read_v3s16(L, 2);
|
v3s16 maxp = read_v3s16(L, 2);
|
||||||
sortBoxVerticies(minp, maxp);
|
sortBoxVerticies(minp, maxp);
|
||||||
|
|
||||||
|
const NodeDefManager *ndef = env->getGameDef()->ndef();
|
||||||
|
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
const NodeDefManager *ndef = getClient(L) ? getClient(L)->ndef() : getServer(L)->ndef();
|
|
||||||
if (getClient(L)) {
|
if (getClient(L)) {
|
||||||
minp = getClient(L)->CSMClampPos(minp);
|
minp = getClient(L)->CSMClampPos(minp);
|
||||||
maxp = getClient(L)->CSMClampPos(maxp);
|
maxp = getClient(L)->CSMClampPos(maxp);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
const NodeDefManager *ndef = getServer(L)->ndef();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
v3s16 cube = maxp - minp + 1;
|
v3s16 cube = maxp - minp + 1;
|
||||||
@ -892,20 +875,19 @@ int ModApiEnvMod::l_find_nodes_in_area_under_air(lua_State *L)
|
|||||||
* TODO
|
* TODO
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GET_ENV_PTR;
|
GET_PLAIN_ENV_PTR;
|
||||||
|
|
||||||
v3s16 minp = read_v3s16(L, 1);
|
v3s16 minp = read_v3s16(L, 1);
|
||||||
v3s16 maxp = read_v3s16(L, 2);
|
v3s16 maxp = read_v3s16(L, 2);
|
||||||
sortBoxVerticies(minp, maxp);
|
sortBoxVerticies(minp, maxp);
|
||||||
|
|
||||||
|
const NodeDefManager *ndef = env->getGameDef()->ndef();
|
||||||
|
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
const NodeDefManager *ndef = getClient(L) ? getClient(L)->ndef() : getServer(L)->ndef();
|
|
||||||
if (getClient(L)) {
|
if (getClient(L)) {
|
||||||
minp = getClient(L)->CSMClampPos(minp);
|
minp = getClient(L)->CSMClampPos(minp);
|
||||||
maxp = getClient(L)->CSMClampPos(maxp);
|
maxp = getClient(L)->CSMClampPos(maxp);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
const NodeDefManager *ndef = getServer(L)->ndef();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
v3s16 cube = maxp - minp + 1;
|
v3s16 cube = maxp - minp + 1;
|
||||||
@ -1034,7 +1016,7 @@ int ModApiEnvMod::l_clear_objects(lua_State *L)
|
|||||||
// line_of_sight(pos1, pos2) -> true/false, pos
|
// line_of_sight(pos1, pos2) -> true/false, pos
|
||||||
int ModApiEnvMod::l_line_of_sight(lua_State *L)
|
int ModApiEnvMod::l_line_of_sight(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_PLAIN_ENV_PTR;
|
||||||
|
|
||||||
// read position 1 from lua
|
// read position 1 from lua
|
||||||
v3f pos1 = checkFloatPos(L, 1);
|
v3f pos1 = checkFloatPos(L, 1);
|
||||||
|
@ -32,14 +32,39 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#define luamethod_aliased(class, name, alias) {#name, class::l_##name}, {#alias, class::l_##name}
|
#define luamethod_aliased(class, name, alias) {#name, class::l_##name}, {#alias, class::l_##name}
|
||||||
#define API_FCT(name) registerFunction(L, #name, l_##name, top)
|
#define API_FCT(name) registerFunction(L, #name, l_##name, top)
|
||||||
|
|
||||||
#define MAP_LOCK_REQUIRED
|
// For future use
|
||||||
#define NO_MAP_LOCK_REQUIRED
|
#define MAP_LOCK_REQUIRED ((void)0)
|
||||||
|
#define NO_MAP_LOCK_REQUIRED ((void)0)
|
||||||
|
|
||||||
|
/* In debug mode ensure no code tries to retrieve the server env when it isn't
|
||||||
|
* actually available (in CSM) */
|
||||||
|
#if !defined(SERVER) && !defined(NDEBUG)
|
||||||
|
#define DEBUG_ASSERT_NO_CLIENTAPI \
|
||||||
|
FATAL_ERROR_IF(getClient(L) != nullptr, "Tried " \
|
||||||
|
"to retrieve ServerEnvironment on client")
|
||||||
|
#else
|
||||||
|
#define DEBUG_ASSERT_NO_CLIENTAPI ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Retrieve ServerEnvironment pointer as `env` (no map lock)
|
||||||
#define GET_ENV_PTR_NO_MAP_LOCK \
|
#define GET_ENV_PTR_NO_MAP_LOCK \
|
||||||
|
DEBUG_ASSERT_NO_CLIENTAPI; \
|
||||||
ServerEnvironment *env = (ServerEnvironment *)getEnv(L); \
|
ServerEnvironment *env = (ServerEnvironment *)getEnv(L); \
|
||||||
if (env == NULL) \
|
if (env == NULL) \
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
// Retrieve ServerEnvironment pointer as `env`
|
||||||
#define GET_ENV_PTR \
|
#define GET_ENV_PTR \
|
||||||
MAP_LOCK_REQUIRED; \
|
MAP_LOCK_REQUIRED; \
|
||||||
GET_ENV_PTR_NO_MAP_LOCK
|
GET_ENV_PTR_NO_MAP_LOCK
|
||||||
|
|
||||||
|
// Retrieve Environment pointer as `env` (no map lock)
|
||||||
|
#define GET_PLAIN_ENV_PTR_NO_MAP_LOCK \
|
||||||
|
Environment *env = (Environment *)getEnv(L); \
|
||||||
|
if (env == NULL) \
|
||||||
|
return 0
|
||||||
|
|
||||||
|
// Retrieve Environment pointer as `env`
|
||||||
|
#define GET_PLAIN_ENV_PTR \
|
||||||
|
MAP_LOCK_REQUIRED; \
|
||||||
|
GET_PLAIN_ENV_PTR_NO_MAP_LOCK
|
||||||
|
@ -533,7 +533,7 @@ int ObjectRef::l_set_local_animation(lua_State *L)
|
|||||||
// get_local_animation(self)
|
// get_local_animation(self)
|
||||||
int ObjectRef::l_get_local_animation(lua_State *L)
|
int ObjectRef::l_get_local_animation(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED
|
NO_MAP_LOCK_REQUIRED;
|
||||||
ObjectRef *ref = checkobject(L, 1);
|
ObjectRef *ref = checkobject(L, 1);
|
||||||
RemotePlayer *player = getplayer(ref);
|
RemotePlayer *player = getplayer(ref);
|
||||||
if (player == NULL)
|
if (player == NULL)
|
||||||
|
@ -545,24 +545,6 @@ bool ServerEnvironment::removePlayerFromDatabase(const std::string &name)
|
|||||||
return m_player_database->removePlayer(name);
|
return m_player_database->removePlayer(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, v3s16 *p)
|
|
||||||
{
|
|
||||||
// Iterate trough nodes on the line
|
|
||||||
voxalgo::VoxelLineIterator iterator(pos1 / BS, (pos2 - pos1) / BS);
|
|
||||||
do {
|
|
||||||
MapNode n = getMap().getNode(iterator.m_current_node_pos);
|
|
||||||
|
|
||||||
// Return non-air
|
|
||||||
if (n.param0 != CONTENT_AIR) {
|
|
||||||
if (p)
|
|
||||||
*p = iterator.m_current_node_pos;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
iterator.next();
|
|
||||||
} while (iterator.m_current_index <= iterator.m_last_index);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason,
|
void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason,
|
||||||
const std::string &str_reason, bool reconnect)
|
const std::string &str_reason, bool reconnect)
|
||||||
{
|
{
|
||||||
|
@ -334,16 +334,6 @@ public:
|
|||||||
// This makes stuff happen
|
// This makes stuff happen
|
||||||
void step(f32 dtime);
|
void step(f32 dtime);
|
||||||
|
|
||||||
/*!
|
|
||||||
* Returns false if the given line intersects with a
|
|
||||||
* non-air node, true otherwise.
|
|
||||||
* \param pos1 start of the line
|
|
||||||
* \param pos2 end of the line
|
|
||||||
* \param p output, position of the first non-air node
|
|
||||||
* the line intersects
|
|
||||||
*/
|
|
||||||
bool line_of_sight(v3f pos1, v3f pos2, v3s16 *p = NULL);
|
|
||||||
|
|
||||||
u32 getGameTime() const { return m_game_time; }
|
u32 getGameTime() const { return m_game_time; }
|
||||||
|
|
||||||
void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; }
|
void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; }
|
||||||
|
Loading…
Reference in New Issue
Block a user