module("GameAPI", package.seeall) -- "GameAPI"为用户定义的包名,包名需与其所在的文件名同名。 调用本文件里语法: packMap = require"GameAPI"
--获得当前服的ID
function GameAPI_get_cur_server_ID()
return 1 --假设是1
end
--[[
--生成时间类(游戏将会有自已的时间器,这样可以提供更多随时间变化的特效,同时给玩家一种已在这里度过了很多时间的错觉)
--可以显时两个类(游戏时和当代时),并提供相应的转换公式
--游戏时间将全部以单项数字保存,只是在显示时才转换为日常格式
function GameAPI_create_timer( _game_time_start )
local public = {}
return public
end
--生成数据库处理器
function GameAPI_create_DB()
local public = {}
return public
end
--生成通讯处理器
function GameAPI_create_Talk()
local public = {}
return public
end
--生成组队处理器
function GameAPI_create_Team()
local public = {}
return public
end
--生成帮会处理器
function GameAPI_create_Party()
local public = {}
return public
end
--]]
--获得有效值
function get_valid_t( _t )
local t = {}
local len = table.getn(_t)
for i=1, len do
if nil ~= _t[i] then
t[ table.getn(t) + 1] = _t[i]
end
end
return t
end
--索引管理
function new_index_manager()
local t_index = {}
local public = {}
--创建索引
function public.create_index()
for i=1, 9999999 do
if nil == t_index[i] then
t_index[i] = 1
return i
end
end
myPrint("索引资源用尽", 1)
return nil
end
--索引是否有效
function public.is_valid_index( _index )
if nil ~= t_index[_index] then
return true
end
return false
end
--删除索引
function public.delete_index( _index )
t_index[_index] = nil
end
return public
end
--1:N绑定器
function new_map_for_1_and_N()
local left_set = {}
local right_set = {}
local public = {}
--绑定索引和UID( 1:N )
function public.bind_left_and_right( _left, _right )
if nil == left_set[_left] then
left_set[_left] = {}
end
local len = table.getn(left_set[_left])
for i=1, len do
if left_set[_left][i] == _right then
return
end
end
left_set[_left][table.getn(left_set[_left])+1] = _right
right_set[_right] = _left
end
--清除绑定
function public.clear_left_and_right( _left )
local t_right = public.get_t_map_by_fb_buf_index( _left )
local len = table.getn( t_right )
for i=1, len do
right_set[ t_right[i] ] = nil
end
left_set[_left] = nil
end
--清除绑定
function public.clear_right( _left, _right )
right_set[_right] = nil
local t_right = left_set[_left]
local len = table.getn( t_right )
for i=1, len do
if t_right[i] == _right then
t_right[i] = nil
end
end
end
--通过left获得rigth表
function public.get_t_right_by_left( _left )
return get_valid_t( left_set[_left] )
end
--通过right获得left
function public.get_left_by_right( _right )
return right_set[ _right ]
end
return public
end
--buf绑定器
function new_map_for_index_to_buf( _binder_uid )
local index_set = {}
local public = {}
--获得绑定者标识
function public.get_uid()
return _binder_uid
end
--绑定buf
function public.bind_index_to_buf( _index, _buf )
index_set[ _index ] = _buf
end
--清除绑定
function public.clear_index_to_buf( _index )
index_set[_index] = nil
end
--通过left获得rigth表
function public.get_buf( _index )
return index_set[ _index ]
end
return public
end
--常用绑定者
g_type_binder = new_map_for_index_to_buf( "type" )
function new_binder(_uid, _buf_type_binder, _buf_obj)
--绑定操作类型
g_type_binder.bind_index_to_buf(_uid, _buf_type_binder.get_uid() )
--绑定操作对象
_buf_type_binder.bind_index_to_buf(_uid, _buf_obj)
return _uid
end
function find_t_buf_by_type( _container, _index, _buf_type )
local t_right = _container.get_t_right_by_left( _index )
local ret = {}
local len = table.getn( t_right )
for i=1, len do
if g_type_binder.get_buf( t_right[i] ) == _buf_type then
ret[ table.getn(ret) + 1] = t_right[i]
end
end
return ret
end
module("EvtSvr", package.seeall)
--事件
function new_evt( _evt_iid, _evt_uid )
local public = { evt_iid = _evt_iid, evt_uid = _evt_uid }
return public
end
--查找obj位置
function find_obj_pos(_t, _p)
local len = table.getn( _t )
for i=1, len do
if _t[i] == _p then
return i
end
end
return nil
end
--否决事件监听
function new_vote_evt_listener()
local public = {}
function public.on_vote( _t_evt )
myPrint("未实现 new_vote_evt_listener", 1)
return false
end
return public
end
--执行消息监听
function new_action_evt_listener()
local public = {}
function public.on_action( _t_evt )
myPrint("未实现 new_action_evt_listener", 1)
end
return public
end
--完毕消息监听
function new_response_evt_listener()
local public = {}
function public.on_response( _t_evt )
myPrint("未实现 new_response_evt_listener", 1)
end
return public
end
--消息处理机
function new_evt_server()
local function new_event_map()
local this_public = {}
this_public.map = {}
function this_public.add_listener(_p_recv, _evt_iid)
if nil == this_public.map[_evt_iid] then
this_public.map[_evt_iid] = {}
end
local t = this_public.map[_evt_iid]
if nil == find_obj_pos(t, _p_recv) then
t[ table.getn(t) + 1 ] = _p_recv
end
end
function this_public.remove_listener(_p_recv, _evt_iid)
if nil ~= this_public.map[_evt_iid] then
local t = this_public.map[_evt_iid]
local id = find_obj_pos(t, _p_recv)
if nil ~= id then
local len = table.getn(t)
t[id] = t[len]
t[len] = nil
end
if table.getn(t) <= 0 then
this_public.map[_evt_iid] = nil
end
end
end
function this_public.clear()
this_public.map = {}
end
return this_public
end
local public = {}
public.vote_map = new_event_map()
public.action_map = new_event_map()
public.response_map = new_event_map()
function public.clear()
public.vote_map.clear()
public.action_map.clear()
public.response_map.clear()
end
function public.dispatch_evt( _t_evt )
--记录当前服,用于回复消息
_t_evt.from_evt_svr = public
--否决
if nil ~= public.vote_map.map[ _t_evt.evt_iid ] then
local t = public.vote_map.map[ _t_evt.evt_iid ]
local len = table.getn( t )
for i=1, len do
if t[i].on_vote( _t_evt ) then
return
end
end
end
--触发
if nil ~= public.action_map.map[ _t_evt.evt_iid ] then
local t = public.action_map.map[ _t_evt.evt_iid ]
local len = table.getn( t )
for i=1, len do
t[i].on_action( _t_evt )
end
end
--完毕
if nil ~= public.response_map.map[ _t_evt.evt_iid ] then
local t = public.response_map.map[ _t_evt.evt_iid ]
local len = table.getn( t )
for i=1, len do
t[i].on_response( _t_evt )
end
end
end
return public
end
module("Evt_Define", package.seeall)
pack_evt_svr = require"EvtSvr"
pack_GameAPI = require"GameAPI"
g_evt_index = pack_GameAPI.new_index_manager()
g_evt_buf = pack_GameAPI.new_map_for_index_to_buf( "evt" )
G_EVT_DEFINE =
{
{iid = 1, uid = g_evt_index.create_index(), remark = "开启服务器消息"},
{iid = 2, uid = g_evt_index.create_index(), remark = "初始化服务器消息"},
{iid = 3, uid = g_evt_index.create_index(), remark = "反初始化服务器消息"},
{iid = 4, uid = g_evt_index.create_index(), remark = "关闭服务器消息"},
{iid = 5, uid = g_evt_index.create_index(), remark = "服务器心跳消息"},
}
--生成服务器消息机
function GameAPI_create_Svr_Evt()
local public = {}
public.evt_svr = pack_evt_svr.new_evt_server()
function public.send_start_svr_evt()
local evt = pack_evt_svr.new_evt(G_EVT_DEFINE[1].iid, G_EVT_DEFINE[1].uid)
public.evt_svr.dispatch_evt(evt)
end
function public.send_init_svr_evt()
local evt = pack_evt_svr.new_evt(G_EVT_DEFINE[2].iid, G_EVT_DEFINE[2].uid)
public.evt_svr.dispatch_evt(evt)
end
function public.send_uninit_svr_evt()
local evt = pack_evt_svr.new_evt(G_EVT_DEFINE[3].iid, G_EVT_DEFINE[3].uid)
public.evt_svr.dispatch_evt(evt)
end
function public.send_close_svr_evt()
local evt = pack_evt_svr.new_evt(G_EVT_DEFINE[4].iid, G_EVT_DEFINE[4].uid)
public.evt_svr.dispatch_evt(evt)
end
return public
end
g_svr_evt_binder = pack_GameAPI.new_map_for_index_to_buf( "SVR_EVT" )
module("Space_Define", package.seeall)
pack_GameAPI = require"GameAPI"
pack_Evt_Define = require"Evt_Define"
g_Space_binder = pack_GameAPI.new_map_for_index_to_buf( "SPACE" )
--生成空间类
function GameAPI_create_space( _evt_svr, _name, _t_map_iid )
local public = {}
function public.get_name()
return _name
end
function public.start( _evt )
print("开启 " .. public.get_name() )
end
function public.init( _evt )
print("初始化 " .. public.get_name() )
end
public.start_action = {}
function public.start_action.on_action( _evt )
public.start()
end
_evt_svr.action_map.add_listener(public.start_action, pack_Evt_Define.G_EVT_DEFINE[1].iid)
public.init_action = {}
function public.init_action.on_action( _evt )
public.init( _evt )
end
_evt_svr.action_map.add_listener(public.init_action, pack_Evt_Define.G_EVT_DEFINE[2].iid)
return public
end
module("Time_Define", package.seeall)
pack_GameAPI = require"GameAPI"
pack_Evt_Define = require"Evt_Define"
g_Time_binder = pack_GameAPI.new_map_for_index_to_buf( "TIME" )
--生成时间类
function GameAPI_create_Time( _evt_svr, _name )
local public = {}
function public.get_name()
return _name
end
function public.start( _evt )
print("开启 " .. public.get_name() )
end
function public.init( _evt )
print("初始化 " .. public.get_name() )
end
public.start_action = {}
function public.start_action.on_action( _evt )
public.start()
end
_evt_svr.action_map.add_listener(public.start_action, pack_Evt_Define.G_EVT_DEFINE[1].iid)
public.init_action = {}
function public.init_action.on_action( _evt )
public.init( _evt )
end
_evt_svr.action_map.add_listener(public.init_action, pack_Evt_Define.G_EVT_DEFINE[2].iid)
return public
end
module("Configuration_Define", package.seeall)
pack_GameAPI = require"GameAPI"
pack_Evt_Define = require"Evt_Define"
g_Configuration_binder = pack_GameAPI.new_map_for_index_to_buf( "CONFIGURATION" )
--生成空间类
function GameAPI_create_Configuration( _evt_svr, _name )
local public = {}
function public.get_name()
return _name
end
function public.start( _evt )
print("开启 " .. public.get_name() )
end
function public.init( _evt )
print("初始化 " .. public.get_name() )
end
public.start_action = {}
function public.start_action.on_action( _evt )
public.start()
end
_evt_svr.action_map.add_listener(public.start_action, pack_Evt_Define.G_EVT_DEFINE[1].iid)
public.init_action = {}
function public.init_action.on_action( _evt )
public.init( _evt )
end
_evt_svr.action_map.add_listener(public.init_action, pack_Evt_Define.G_EVT_DEFINE[2].iid)
return public
end
module("Configuration_Lua_1", package.seeall)
pack_Configuration_Define = require"Configuration_Define"
function GameAPI_create_Configuration_ex( _evt_svr, _name )
local public = pack_Configuration_Define.GameAPI_create_Configuration( _evt_svr, _name )
function public.start( _evt )
print("开启 " .. public.get_name() )
end
function public.init( _evt )
print("初始化 --> " .. public.get_name() )
print("初始化 NPC" )
print("初始化 活动配置" )
print("结束初始化 -->")
end
return public
end
pack_GameAPI = require"GameAPI"
pack_Evt_Define = require"Evt_Define"
pack_Space_Define = require"Space_Define"
pack_time_Define = require"Time_Define"
pack_Configuration_Define = require"Configuration_Define"
pack_Configuration_Lua_1 = require"Configuration_Lua_1"
G_Evt_Server = pack_Evt_Define.GameAPI_create_Svr_Evt()
g_server_container = pack_GameAPI.new_map_for_1_and_N()
g_server_index_manager = pack_GameAPI.new_index_manager()
--生成当前服消息处理器
g_server_container.bind_left_and_right(
pack_GameAPI.GameAPI_get_cur_server_ID(),
pack_GameAPI.new_binder( g_server_index_manager.create_index(), pack_Evt_Define.g_svr_evt_binder, G_Evt_Server)
)
--生成当前服空间
g_server_container.bind_left_and_right(
pack_GameAPI.GameAPI_get_cur_server_ID(),
pack_GameAPI.new_binder( g_server_index_manager.create_index(), pack_Space_Define.g_Space_binder, pack_Space_Define.GameAPI_create_space(G_Evt_Server.evt_svr, "新手村空间--服务区", {1560,1561,1562}) )
)
--生成当前服时间
g_server_container.bind_left_and_right(
pack_GameAPI.GameAPI_get_cur_server_ID(),
pack_GameAPI.new_binder( g_server_index_manager.create_index(), pack_time_Define.g_Time_binder, pack_time_Define.GameAPI_create_Time(G_Evt_Server.evt_svr, "新手村时间--游戏时") )
)
--生成当前服配置
g_server_container.bind_left_and_right(
pack_GameAPI.GameAPI_get_cur_server_ID(),
pack_GameAPI.new_binder( g_server_index_manager.create_index(), pack_Configuration_Define.g_Configuration_binder, pack_Configuration_Lua_1.GameAPI_create_Configuration_ex(G_Evt_Server.evt_svr, "新手村配置--脚本1") )
)
--开启服务器
function open_server()
local t_obj = pack_GameAPI.find_t_buf_by_type(g_server_container, pack_GameAPI.GameAPI_get_cur_server_ID(), pack_Evt_Define.g_svr_evt_binder.get_uid() )
local len = table.getn(t_obj)
for i=1, len do
local svr_evt = pack_Evt_Define.g_svr_evt_binder.get_buf( t_obj[i] )
svr_evt.send_start_svr_evt()
end
for i=1, len do
local svr_evt = pack_Evt_Define.g_svr_evt_binder.get_buf( t_obj[i] )
svr_evt.send_init_svr_evt()
end
end
--关闭服务器
function close_server()
local t_obj = pack_GameAPI.find_t_buf_by_type(g_server_container, pack_GameAPI.GameAPI_get_cur_server_ID(), g_svr_evt_binder.get_uid() )
local len = table.getn(t_obj)
for i=1, len do
local svr_evt = g_svr_evt_binder.get_buf( t_obj[i] )
svr_evt.send_uninit_svr_evt()
end
for i=1, len do
local svr_evt = g_svr_evt_binder.get_buf( t_obj[i] )
svr_evt.send_close_svr_evt()
end
end
open_server()