@@ -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+ */
214530public 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+ */
329649public class SimpleHandler : Handler
330650{
331651 public JsonSetting [ ] handle ( object api , Dictionary < string , string > mapper )
0 commit comments