少年修仙传客户端基础资源
client_Wu Xijin
2018-10-21 6f8ed2e37f8762fb3501a671d0dca40bcd68edae
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#if USE_UNI_LUA
using LuaAPI = UniLua.Lua;
using RealStatePtr = UniLua.ILuaState;
using LuaCSFunction = UniLua.CSharpFunctionDelegate;
#else
using LuaAPI = XLua.LuaDLL.Lua;
using RealStatePtr = System.IntPtr;
using LuaCSFunction = XLua.LuaDLL.lua_CSFunction;
#endif
 
using XLua;
using System.Collections.Generic;
<%
require "TemplateCommon"
 
local parameters = delegate:GetParameters()
local in_num = CalcCsList(parameters, function(p) return p.IsIn or not p.IsOut end)
local out_num = CalcCsList(parameters, function(p) return p.IsOut or p.ParameterType.IsByRef end)
local in_pos = 0
local has_return = (delegate.ReturnType.Name ~= "Void")
%>
 
namespace XLua.CSObjectWrap
{
    using Utils = XLua.Utils;
    public class <%=CSVariableName(type)%>Wrap
    {
        public static void __Register(RealStatePtr L)
        {
            ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
            Utils.BeginObjectRegister(typeof(<%=CsFullTypeName(type)%>), L, translator, 0, 0, 0, 0);
            Utils.EndObjectRegister(typeof(<%=CsFullTypeName(type)%>), L, translator, null, null, null, null, null);
            
            Utils.BeginClassRegister(typeof(<%=CsFullTypeName(type)%>), L, null, 1, 0, 0);
            Utils.EndClassRegister(typeof(<%=CsFullTypeName(type)%>), L, translator);
        }
        
        static Dictionary<string, LuaCSFunction> __MetaFucntions_Dic = new Dictionary<string, LuaCSFunction>(){
            {"__call", __CallMeta},
            {"__add", __AddMeta},
            {"__sub", __SubMeta},
        };
        
        [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
        static int __CallMeta(RealStatePtr L)
        {
            ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
            try {
                if(LuaAPI.lua_gettop(L) == <%=in_num+1%> && <%=GetCheckStatement(type, 1)%><%
                    ForEachCsList(parameters, function(parameter) 
                        if parameter.IsIn or not parameter.IsOut then in_pos = in_pos + 1; 
                        %>&& <%=GetCheckStatement(parameter.ParameterType, in_pos+1)%><% 
                        end 
                    end)%>)
                {
                <% 
                in_pos = 0;
                ForEachCsList(parameters, function(parameter) 
                    %><% 
                    if parameter.IsIn or not parameter.IsOut then 
                        in_pos = in_pos + 1
                        %><%=GetCasterStatement(parameter.ParameterType, in_pos+1, parameter.Name, true)%><%
                    else%><%=CsFullTypeName(parameter.ParameterType)%> <%=parameter.Name%><%end%>;
                <%end)%>
                <%=GetSelfStatement(type)%>;
                
                <%
                if has_return then
                    %>    <%=CsFullTypeName(delegate.ReturnType)%> __cl_gen_ret = <%
                end
                %>    __cl_gen_to_be_invoked( <%ForEachCsList(parameters, function(parameter, pi) if pi ~= 0 then %>, <% end; if parameter.IsOut then %>out <% elseif parameter.ParameterType.IsByRef then %>ref <% end %><%=parameter.Name%><% end) %> );
                <%
                if has_return then
                %>    <%=GetPushStatement(delegate.ReturnType, "__cl_gen_ret")%>;
                <%
                end
                local in_pos = 0
                ForEachCsList(parameters, function(parameter)
                    if parameter.IsIn or not parameter.IsOut then 
                        in_pos = in_pos + 1
                    end
                    if parameter.IsOut or parameter.ParameterType.IsByRef then
                    %><%=GetPushStatement(parameter.ParameterType:GetElementType(), parameter.Name)%>;
                    <%if not parameter.IsOut and parameter.ParameterType.IsByRef and NeedUpdate(parameter.ParameterType) then 
                  %><%=GetUpdateStatement(parameter.ParameterType:GetElementType(), in_pos+param_offset, parameter.Name)%>;
                        <%end%>
                <%
                    end
                end)
                %>
                    
                    return <%=out_num+(has_return and 1 or 0)%>;
                }
            } catch(System.Exception __gen_e) {
                return LuaAPI.luaL_error(L, "c# exception:" + __gen_e);
            }
            return LuaAPI.luaL_error(L, "invalid arguments to Delegate <%=CsFullTypeName(type)%>!");
        }
        
        [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
        static int __AddMeta(RealStatePtr L)
        {
            ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
            try {
                <%=GetCasterStatement(type, 1, "leftside", true)%>;
                <%=GetCasterStatement(type, 2, "rightside", true)%>;
                <%=GetPushStatement(type, "leftside + rightside")%>;
                return 1;
            } catch(System.Exception __gen_e) {
                return LuaAPI.luaL_error(L, "c# exception:" + __gen_e);
            }
        }
        
        [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
        static int __SubMeta(RealStatePtr L)
        {
            ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
            try {
                <%=GetCasterStatement(type, 1, "leftside", true)%>;
                <%=GetCasterStatement(type, 2, "rightside", true)%>;
                <%=GetPushStatement(type, "leftside - rightside")%>;
                return 1;
            } catch(System.Exception __gen_e) {
                return LuaAPI.luaL_error(L, "c# exception:" + __gen_e);
            }
        }
    }
}