Skip to content

Commit f7f0fe3

Browse files
author
magiclu550
committed
[proxy] toCharArray
1 parent 4ec5d5b commit f7f0fe3

File tree

3 files changed

+377
-4
lines changed

3 files changed

+377
-4
lines changed

jsmod2/Lib.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public static object getObject(Dictionary<string, string> dic, Type type,string
112112

113113
public static string[] getArray(string s)
114114
{
115+
115116
return s.Split(',');
116117
}
117118

@@ -120,7 +121,8 @@ public static Vector getVector(string s)
120121

121122
try
122123
{
123-
string[] xyz = s.Split(',');
124+
s = s.Replace("(", "").Replace(")", "");
125+
string[] xyz = s.Split('-');
124126
float x = getDouble(xyz[0]);
125127
float y = getDouble(xyz[1]);
126128
float z = getDouble(xyz[2]);

jsmod2/NetworkHandler.cs

Lines changed: 320 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ static NetworkHandler()
8989
handlers.Add(184,new HandleTeamRespawnEventGetPlayers());
9090
handlers.Add(185,new HandleTeamRespawnEventSetPlayers());
9191
handlers.Add(190,new HandleDo());
92+
handlers.Add(191,new HandleGiveItem());
93+
handlers.Add(192,new HandleInventory());
94+
handlers.Add(193,new HandleCurrentItem());
95+
handlers.Add(194,new HandleUserGroup());
96+
handlers.Add(195,new HandleDoApi());
97+
handlers.Add(196,new HandleMapApi());
9298
}
9399
public static void handleJsmod2(int id, String json,Dictionary<string,string> mapper,TcpClient client)
94100
{
@@ -167,6 +173,13 @@ public static object getTypeValue(string val)
167173
return i1;
168174
}
169175

176+
long l1;
177+
b = long.TryParse(val, out l1);
178+
if (b)
179+
{
180+
return l1;
181+
}
182+
170183
bool b1;
171184
b = bool.TryParse(val, out b1);
172185
if (b)
@@ -211,6 +224,309 @@ public static bool isCommon(Type returnType)
211224
}
212225
}
213226

227+
/**
228+
* 为map定制的Handler
229+
*/
230+
//value 值 字段 1
231+
//args 参数 方法
232+
//method 方法名
233+
//field 字段名 1
234+
//write 读 字段_赋值 方法_无返回值 1 0
235+
//read 写 字段_得到值 方法_有返回值 1 0
236+
//apiId 说明设置的值是api对象 1
237+
238+
//字段的输出包分为以下的要素
239+
// field 字段
240+
// value 值
241+
//read write 可读性
242+
// apiId 是否是api类型
243+
//方法的输出包分为以下的要素
244+
//method 方法
245+
//args 参数
246+
//write 可读性
247+
248+
public class HandleMapApi : Handler
249+
{
250+
public JsonSetting[] handle(object api, Dictionary<string, string> mapper)
251+
{
252+
Map map = ProxyHandler.handler.Server.Map;
253+
Type type = typeof(Map);
254+
if (mapper.ContainsKey("field"))//field
255+
{
256+
PropertyInfo info = type.GetProperty("field");
257+
if (info != null)
258+
{
259+
//两种情况 读写
260+
if (mapper.ContainsKey("write"))//write
261+
{
262+
//赋值
263+
if (mapper.ContainsKey("apiId"))
264+
{
265+
info.SetValue(map,ProxyHandler.handler.apiMapping[mapper["value"]]);
266+
}
267+
else
268+
{
269+
if (Utils.isCommon(info.PropertyType))
270+
{
271+
info.SetValue(map,Utils.getTypeValue(mapper["value"]));
272+
}
273+
274+
}
275+
276+
return null;
277+
}
278+
else//no write
279+
{
280+
//获得值
281+
//字段只支持普通值
282+
object obj = info.GetValue(map);
283+
if (Utils.isCommon(obj.GetType()))
284+
{
285+
return Utils.getOne(mapper["id"], obj, null);
286+
}
287+
else
288+
{
289+
return Utils.getOne(mapper["id"], obj, null);
290+
}
291+
}
292+
}
293+
}
294+
295+
if (mapper.ContainsKey("method")) //method
296+
{
297+
object obj;//return
298+
MethodInfo info = type.GetMethod(mapper["method"]);
299+
if (info != null)
300+
{
301+
if (mapper.ContainsKey("args"))
302+
{
303+
string[] args = Lib.getArray(mapper["args"]);
304+
object[] objs = new object[args.Length];
305+
ParameterInfo[] infos = info.GetParameters();
306+
for (int i = 0; i < args.Length; i++)
307+
{
308+
if (Utils.isCommon(infos[i].ParameterType))
309+
{
310+
objs[i] = Utils.getTypeValue(args[i]);//针对于普通值
311+
}
312+
else
313+
{
314+
if (infos[i].ParameterType == typeof(Player))
315+
{
316+
objs[i] = ProxyHandler.handler.apiMapping[args[i]];//转换玩家对象
317+
}
318+
else
319+
{
320+
objs[i] = JsonConvert.SerializeObject(args[i]);//针对枚举值
321+
}
322+
}
323+
}
324+
325+
obj = info.Invoke(map, objs);
326+
}
327+
else
328+
{
329+
obj = info.Invoke(map,null);
330+
}
331+
//有返回值
332+
if (mapper.ContainsKey("read"))
333+
{
334+
if (Utils.isCommon(info.ReturnType))
335+
{
336+
return Utils.getOne(mapper["id"],obj,null);//普通值
337+
}
338+
339+
if (obj is Enum)
340+
{
341+
return Utils.getOne(mapper["id"], obj, null);//枚举值
342+
}
343+
//特殊对象
344+
if (obj is List<Item>)
345+
{
346+
List<Item> items = (List<Item>) obj;
347+
JsonSetting[] settings = new JsonSetting[items.Count];
348+
for (int i = 0; i < settings.Length; i++)
349+
{
350+
settings[i] = new JsonSetting(Lib.getInt(mapper["id"]),null,new IdMapping().appendId(Lib.ID,items[i]));
351+
}
352+
return settings;
353+
}
354+
355+
if (obj is List<Vector> || obj is Dictionary<Vector,Vector>)
356+
{
357+
358+
return Utils.getOne(mapper["id"],obj,null);
359+
}
360+
361+
if (obj is List<Door>)
362+
{
363+
List<Door> doors = (List<Door>) obj;
364+
JsonSetting[] settings = new JsonSetting[doors.Count];
365+
for (int i = 0; i < settings.Length; i++)
366+
{
367+
settings[i] = new JsonSetting(Lib.getInt(mapper["id"]),null,new IdMapping()
368+
.appendId(Lib.ID,doors[i])
369+
);
370+
}
371+
372+
return settings;
373+
}
374+
375+
if (obj is List<PocketDimensionExit>)
376+
{
377+
List<PocketDimensionExit> exits = (List<PocketDimensionExit>) obj;
378+
JsonSetting[] settings = new JsonSetting[exits.Count];
379+
for (int i = 0; i < settings.Length; i++)
380+
{
381+
settings[i] = new JsonSetting(Lib.getInt(mapper["id"]),null,new IdMapping()
382+
.appendId(Lib.ID,exits[i])
383+
);
384+
}
385+
return settings;
386+
}
387+
388+
if (obj is Generator[])
389+
{
390+
Generator[] generators = (Generator[]) obj;
391+
JsonSetting[] settings = new JsonSetting[generators.Length];
392+
for (int i = 0; i < settings.Length; i++)
393+
{
394+
settings[i] = new JsonSetting(Lib.getInt(mapper["id"]),null,new IdMapping()
395+
.appendId(Lib.ID,generators[i])
396+
);
397+
}
398+
399+
return settings;
400+
}
401+
402+
if (obj is Room[])
403+
{
404+
Room[] rooms = (Room[]) obj;
405+
JsonSetting[] settings = new JsonSetting[rooms.Length];
406+
for (int i = 0; i < settings.Length; i++)
407+
{
408+
settings[i] = new JsonSetting(Lib.getInt(mapper["id"]),null,new IdMapping()
409+
.appendId(Lib.ID,rooms[i])
410+
);
411+
}
412+
413+
return settings;
414+
}
415+
416+
if (obj is List<Elevator>)
417+
{
418+
List<Elevator> elevators = (List<Elevator>) obj;
419+
JsonSetting[] settings = new JsonSetting[elevators.Count];
420+
for (int i = 0; i < settings.Length; i++)
421+
{
422+
settings[i] = new JsonSetting(Lib.getInt(mapper["id"]),null,new IdMapping());
423+
}
424+
425+
return settings;
426+
}
427+
428+
if (obj is List<TeslaGate>)
429+
{
430+
List<TeslaGate> teslaGates = (List<TeslaGate>) obj;
431+
JsonSetting[] settings = new JsonSetting[teslaGates.Count];
432+
for (int i = 0; i < settings.Length; i++)
433+
{
434+
settings[i] = new JsonSetting(Lib.getInt(mapper["id"]),null,new IdMapping().appendId(Lib.ID,teslaGates[i]));
435+
}
436+
437+
return settings;
438+
}
439+
440+
if (obj is Player)
441+
{
442+
//last
443+
Player player = (Player) obj;
444+
return Utils.getOne(mapper["id"], null, new IdMapping()
445+
.appendId(Lib.ID,Guid.NewGuid().ToString(),player).appendId(Lib.PLAYER_SCPDATA_ID,Guid.NewGuid().ToString(),player.Scp079Data).appendId(Lib.PLAYER_TEAM_ROLE_ID,Guid.NewGuid().ToString(),player.TeamRole)
446+
);
447+
}
448+
449+
450+
}
451+
else
452+
{
453+
//无返回值
454+
return null;
455+
}
456+
}
457+
458+
459+
}
460+
461+
return null;
462+
}
463+
}
464+
465+
466+
/**
467+
* 调用方法,可以设置api的值
468+
*/
469+
public class HandleDoApi : Handler
470+
{
471+
public JsonSetting[] handle(object api, Dictionary<string, string> mapper)
472+
{
473+
object value= ProxyHandler.handler.apiMapping[mapper["value"]];
474+
api.GetType().GetMethod(mapper["method"]).Invoke(api, new []{value});
475+
return null;
476+
}
477+
}
478+
479+
public class HandleUserGroup : Handler
480+
{
481+
public JsonSetting[] handle(object api, Dictionary<string, string> mapper)
482+
{
483+
Player player = api as Player;
484+
TeamRole t = player.TeamRole;
485+
return Utils.getOne(mapper["id"], null, new IdMapping().appendId(Lib.ID, t));
486+
}
487+
}
488+
489+
public class HandleGiveItem : Handler
490+
{
491+
public JsonSetting[] handle(object api, Dictionary<string, string> mapper)
492+
{
493+
Player player = api as Player;
494+
ItemType type = (ItemType)JsonConvert.DeserializeObject(mapper["item"],typeof(ItemType));
495+
Item item = player.GiveItem(type);
496+
return Utils.getOne(mapper["id"], null, new IdMapping().appendId(Lib.ID, item));
497+
}
498+
}
499+
500+
public class HandleInventory : Handler
501+
{
502+
public JsonSetting[] handle(object api, Dictionary<string, string> mapper)
503+
{
504+
Player player = api as Player;
505+
List<Item> items = player.GetInventory();
506+
JsonSetting[] settings = new JsonSetting[items.Count];
507+
for (int i = 0; i < items.Count; i++)
508+
{
509+
settings[i] = new JsonSetting(Lib.getInt(mapper["id"]),null,new IdMapping().appendId(Lib.ID,items[i]));
510+
}
511+
512+
return settings;
513+
}
514+
}
515+
516+
public class HandleCurrentItem : Handler
517+
{
518+
public JsonSetting[] handle(object api, Dictionary<string, string> mapper)
519+
{
520+
Player player = api as Player;
521+
Item item = player.GetCurrentItem();
522+
return Utils.getOne(mapper["id"], null, new IdMapping().appendId(Lib.ID, item));
523+
}
524+
}
525+
526+
/**
527+
* 支持设置枚举值,基本类型值
528+
* 返回基本类型和枚举值
529+
*/
214530
public class HandleDo : Handler
215531
{
216532
public JsonSetting[] handle(object api, Dictionary<string, string> mapper)
@@ -326,6 +642,10 @@ public JsonSetting[] handle(object api, Dictionary<string, string> mapper)
326642
}
327643
}
328644

645+
/**
646+
* 可以设置基本类型值,api类型值,枚举值
647+
* 可以返回基本类型值,枚举值
648+
*/
329649
public class SimpleHandler : Handler
330650
{
331651
public JsonSetting[] handle(object api, Dictionary<string, string> mapper)

0 commit comments

Comments
 (0)