stoneage8.5/石器时代服务器端最新完整源代码/Serv/gmsv/npc_lua/npc_lua_map.c
anson1788 a5b185b7ef Revert "re upload"
This reverts commit 274b7d169c.
2020-06-23 15:23:51 +08:00

327 lines
8.0 KiB
C

#include "npc_lua.h"
#include "util.h"
#include "char.h"
#include "char_base.h"
#include "anim_tbl.h"
#include "object.h"
#include "net.h"
#include "npcutil.h"
#include "npc_eventaction.h"
#include "battle.h"
#include "readmap.h"
#include "item.h"
#include "npc_lua.h"
#define _JZ_NEWSCRIPT_LUA
#ifdef _ALLBLUE_LUAscript
/*
char *MAP_getFloorName( int floor)
*/
int NPC_ABLua_map_getFloorName(lua_State *_NLL)
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int Floorid = (int)lua_tointeger(_NLL, 1);
LRetMsg(_NLL , MAP_getFloorName(Floorid));
}
int NPC_ABLua_map_getfloorX(lua_State *_NLL)
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int Floorid = (int)lua_tointeger(_NLL, 1);
LRetMsg(_NLL , MAP_getfloorX(Floorid));
}
int NPC_ABLua_map_getfloorY(lua_State *_NLL)
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int Floorid = (int)lua_tointeger(_NLL, 1);
LRetMsg(_NLL , MAP_getfloorY(Floorid));
}
#endif
int NPC_Lua_Map_CheckCoordinates(lua_State *_NLL) //检测某点是否在地图范围内。
{
CheckEx(_NLL, 3);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
int x = (int)lua_tointeger(_NLL, 2);
int y = (int)lua_tointeger(_NLL, 3);
BOOL RETBOOL = MAP_checkCoordinates(map,x,y);
LRetBool(_NLL, RETBOOL);
}
int NPC_Lua_Map_GetExitFloorXY(lua_State *_NLL) //检测地图是否支持登出
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
int maparray[3];
int map_type=0;
unsigned int point;
point = MAP_getExFloor_XY( map , &map_type);
if( point > 0 ) {
if( map_type >= 0 ) { // map_type >= 0 优先回纪录点
if( map == map_type && map >= 0 ) {//回纪录点
}else {
maparray[0] = (point>>16)&0xffffff;
maparray[1] = (point>>8)&0xff;
maparray[2] = (point>>0)&0xff;
}
}
}
else if( map == 10032 ){
maparray[0] = 10030;
maparray[1] = 52;
maparray[2] = 36;
}
#ifdef _MAP_TIME
else if (map >= 30017 && map >= 30021)
{
maparray[0]= 30008;
maparray[1] = 39;
maparray[2] = 39;
}
#endif
else {
maparray[0] = map;
maparray[1] = 0;
maparray[2] = 0;
}
LRetArray(_NLL,maparray,arraysizeof(maparray));
}
int NPC_Lua_Map_GetfloorX(lua_State *_NLL) //获取地图X长度
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
int x;
x = MAP_getfloorX(map);
LRetInt(_NLL, x);
}
int NPC_Lua_Map_GetfloorY(lua_State *_NLL) //获取地图Y长度
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
int y;
y = MAP_getfloorX(map);
LRetInt(_NLL, y);
}
int NPC_Lua_Map_GetTileAndObjId(lua_State *_NLL) //获取地图某点的地板和装饰层
{
CheckEx(_NLL, 3);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
int x = (int)lua_tointeger(_NLL, 2);
int y = (int)lua_tointeger(_NLL, 3);
int *tile = -1, *obj = -1;
MAP_getTileAndObjData(map,x,y,&tile,&obj);
int maparray[2];
maparray[0]=tile;
maparray[1]=obj;
LRetArray(_NLL,maparray,arraysizeof(maparray));
}
int NPC_Lua_Map_SetTileAndObjId(lua_State *_NLL) //设置地图某点的地板和装饰层
{
CheckEx(_NLL, 5);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
int x = (int)lua_tointeger(_NLL, 2);
int y = (int)lua_tointeger(_NLL, 3);
int tile = (int)lua_tointeger(_NLL, 4);
int obj = (int)lua_tointeger(_NLL, 5);
if (MAP_setTileAndObjData(map,x,y,tile,obj)) LRetInt(_NLL, 0);
LRetInt(_NLL, -1);
}
int NPC_Lua_Map_GetWalkAbleFromPoint(lua_State *_NLL) //获取某点是否可以行走
{
CheckEx2(_NLL, 3,4);
CheckIndexNull(_NLL, 1);
int TM_Top = lua_gettop(_NLL);
int map = (int)lua_tointeger(_NLL, 1);
int x = (int)lua_tointeger(_NLL, 2);
int y = (int)lua_tointeger(_NLL, 3);
BOOL IsFly = FALSE;
if(TM_Top==4){
IsFly = (BOOL)lua_toboolean(_NLL, 4);
}
IsFly = MAP_walkAbleFromPoint(map,x,y,IsFly);
LRetBool(_NLL, IsFly);
}
int NPC_Lua_Map_GetImageData(lua_State *_NLL) //获取图片数据
{
CheckEx(_NLL, 2);
CheckIndexNull(_NLL, 1);
int MapImageid = (int)lua_tointeger(_NLL, 1);
int flg = (int)lua_tointeger(_NLL, 2);
if(flg >= 0)
{
if(flg < LUA_DATALINE1)
{
flg -= LUA_DATALINE0;
int TM_RetInt = MAP_getImageInt(MapImageid, flg);
LRetInt(_NLL, TM_RetInt);
}
}
LRetErrNull(_NLL, "传入的标志是错误的。");
}
int NPC_Lua_Map_SetImageData(lua_State *_NLL) //设置图片数据
{
CheckEx(_NLL, 3);
CheckIndexNull(_NLL, 1);
int MapImageid = (int)lua_tointeger(_NLL, 1);
int flg = (int)lua_tointeger(_NLL, 2);
int val = (int)lua_tointeger(_NLL, 3);
if(flg >= 0)
{
if(flg < LUA_DATALINE1)
{
flg -= LUA_DATALINE0;
BOOL TM_RetBool = MAP_setImageInt(MapImageid, flg, val);
LRetBool(_NLL, TM_RetBool);
}
}
LRetErrNull(_NLL, "传入的标志是错误的。");
}
static OBJECT TM_Object = NULL;
int NPC_Lua_Map_GetTopObj(lua_State *_NLL) //用来获取地图某点上对象
{
CheckEx(_NLL, 3);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
int x = (int)lua_tointeger(_NLL, 2);
int y = (int)lua_tointeger(_NLL, 3);
TM_Object = MAP_getTopObj( map, x, y) ;
LRetBool(_NLL, TRUE);
}
int NPC_Lua_Map_GetNextObj(lua_State *_NLL) //获取下一个对象索引
{
CheckEx(_NLL, 0);
int TM_ObjIndex = GET_OBJINDEX(TM_Object);
TM_Object = NEXT_OBJECT(TM_Object);
if( !CHECKOBJECTUSE(TM_ObjIndex) )
{
LRetInt(_NLL, -1);
TM_Object = NULL;
}
LRetInt(_NLL, TM_ObjIndex);
}
int NPC_Lua_Map_CheckImageIndex(lua_State *_NLL) //检测某地图号图片是否存在
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
BOOL TM_Ret = IsValidImagenumber( map) ;
LRetBool(_NLL, TM_Ret);
}
int NPC_Lua_Map_CheckIndex(lua_State *_NLL) //检测某地图号地图是否存在
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
BOOL TM_Ret = CHECKFLOORID( map) ;
LRetBool(_NLL, TM_Ret);
}
int NPC_Lua_Map_MakeNewMap(lua_State *_NLL) //制造一个副本地图,并返回新地图号
{
CheckEx2(_NLL, 1, 2);
CheckIndexNull(_NLL, 1);
int TM_Top = lua_gettop(_NLL);
int map = (int)lua_tointeger(_NLL, 1);
char *name = "";
if(TM_Top == 2)
{
CheckIndexNull(_NLL, 2);
name = lua_tostring(_NLL, 2);
}
int TM_Ret = MAP_makenew( map,name) ;
LRetInt(_NLL, TM_Ret);
}
int NPC_Lua_Map_DelNewMap(lua_State *_NLL) //删除一个副本地图
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
BOOL TM_Ret = MAP_DelMap( map) ;
LRetBool(_NLL, TM_Ret);
}
int NPC_Lua_Map_SetExWarp(lua_State *_NLL) //设置一个地图的退出传送点
{
CheckEx(_NLL, 5);
CheckIndexNull(_NLL, 1);
int map = (int)lua_tointeger(_NLL, 1);
int exfl = (int)lua_tointeger(_NLL, 2);
int exx = (int)lua_tointeger(_NLL, 3);
int exy = (int)lua_tointeger(_NLL, 4);
int type = (int)lua_tointeger(_NLL, 4);//地图类型
BOOL TM_Ret = MAP_SetExWarp( map, exfl,exx,exy,type) ;
LRetBool(_NLL, TM_Ret);
}
int NPC_Lua_Map_SetMapPoint(lua_State *_NLL) //设置一个地图传送点 返回一个传送点索引
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
char* mappoint = lua_tostring(_NLL, 1);
int TM_Ret = SetMapPoint( mappoint) ;
LRetInt(_NLL, TM_Ret);
}
int NPC_Lua_Map_DelMapPoint(lua_State *_NLL) //删除一个传送点
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int ps = (int)lua_tointeger(_NLL, 1);
BOOL TM_Ret = DelMapPoint( ps) ;
LRetBool(_NLL, TM_Ret);
}
int NPC_Lua_Map_getFloorName(lua_State *_NLL) //返回一个地图名
{
CheckEx(_NLL, 1);
CheckIndexNull(_NLL, 1);
int MapID = (int)lua_tointeger(_NLL, 1);
char *MapName = MAP_getFloorName( MapID) ;
LRetMsg(_NLL, MapName);
}
/*
int NPC_Lua_Map_Upmap(lua_State *_NLL) //更新地图
{
CheckEx(_NLL, 3);
CheckIndexNull(_NLL, 1);
int TM_Index = (int)lua_tointeger(_NLL, 1);
int formatmap = (int)lua_tointeger(_NLL, 2);
int tomap = (int)lua_tointeger(_NLL, 3);
lssproto_Upmap_send(TM_Index,formatmap,tomap);
LRetBool(_NLL, TRUE);
}
*/