1+ import  Source2Py 
2+ import  logging , inspect 
3+ import  traceback 
4+ 
5+ #logging.basicConfig(filename='SampleEvents.log', encoding='utf-8', level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S') 
6+ logging .basicConfig (filename = 'tests/TestPlayerDeath.log' , encoding = 'utf-8' , level = logging .DEBUG , format = '[%(asctime)s]%(message)s' , datefmt = '%H:%M:%S' )
7+ log  =  logging 
8+ 
9+ 
10+ def  alog (message : str , callername : bool  =  True ):
11+     caller  =  str ("" )
12+     if  (callername ):
13+         caller  =  "["  +  str (inspect .stack ()[1 ].function ) +  "] " 
14+     Source2Py .ServerPrint ("[TestPlayerDeath]"  +  caller  +  str (message ))
15+     log .info (msg = ("[TestPlayerDeath]"  +  caller  +  str (message )))
16+     pass 
17+ 
18+ alog ("START" )
19+ 
20+ from  tests  import  dumped_events 
21+ 
22+ #base game events 
23+ event_dict_of_dict  =  dict ({})
24+ for  k , v  in  dumped_events .dumped_events .items ():
25+     event_dict_of_dict .update (v )
26+ 
27+ class  Event (object ):
28+     def  __setitem__ (self , key , value ):
29+         setattr (self , key , value )
30+     def  __getitem__ (self , key ):
31+         return  getattr (self , key )
32+     def  items (self ):
33+         return  self .__dict__ .items ()
34+     def  __init__ (self , _event ):
35+         try :
36+             self ["name" ] =  _event .GetName ()
37+             keys  =  event_dict_of_dict .get (self ["name" ], dict ())
38+             for  k , v  in  keys .items ():
39+                 GEKS  =  Source2Py .GameEventKeySymbol_t (k )
40+ 
41+                 # some or all may be wrong, but working for now 
42+                 if    (v  ==  "string" ):
43+                     self [k ] =  _event .GetString (GEKS , "None" )
44+                 elif  (v  ==  "bool" ):
45+                     self [k ] =  _event .GetBool (GEKS , False )
46+                 elif  (v  ==  "byte" ):
47+                     self [k ] =  _event .GetInt (GEKS , - 1 )      #python cares not, will automagically sort this mess 
48+                 elif  (v  ==  "short" ):                       #mess 
49+                     self [k ] =  _event .GetInt (GEKS , - 1 )      #mess 
50+                 elif  (v  ==  "long" ):                        #mess 
51+                     self [k ] =  _event .GetInt (GEKS , - 1 )      #mess 
52+                 elif  (v  ==  "int" ):                         #mess 
53+                     self [k ] =  _event .GetInt (GEKS , - 1 )      #mess 
54+                 elif  (v  ==  "float" ):                       #mess 
55+                     self [k ] =  _event .GetFloat (GEKS , - 1.0 )  #mess 
56+                 elif  (v  ==  "player_pawn" ):                 #mess 
57+                     self [k ] =  _event .GetInt (GEKS , - 1 )      #mess 
58+                 elif  (v  ==  "playercontroller" ):            #universally used as player id on server for all events (so far) 
59+                     self [k ] =  _event .GetPlayerSlot (GEKS ).Get ()
60+                     #self[k] = _event.GetInt(GEKS, -1) 
61+ 
62+                 elif  (v  ==  "uint64" ):                      #player steamid or contentid on steam network 
63+                     self [k ] =  _event .GetUint64 (GEKS , 0 )
64+ 
65+                 elif  (v  ==  "strict_ehandle" ):
66+                     #GetEntity is used for _pawn keys like attacker_pawn and userid_pawn which are the only ones currently using strict_ehandle 
67+                     #self[k] = _event.GetEntity(GEKS, None) 
68+                     pass 
69+                 else : #   local, hint_,  
70+                     alog ("else!!! "  +  str (k ) +  " "  +  str (v ))
71+                     pass 
72+                 #alog("K: " + k + " V: " + v + ": " + str(self[k]))        except Exception as e: 
73+         except  Exception  as  e :
74+             alog (e )
75+             alog (traceback .format_exc ())
76+ 
77+ class  TestPlayerDeath :
78+     '''"player_death":dict({ 
79+                 "userid":"playercontroller", 
80+                 "userid_pawn":"strict_ehandle", 
81+                 "attacker":"playercontroller", 
82+                 "attacker_pawn":"strict_ehandle", 
83+                 "assister":"playercontroller", 
84+                 "assister_pawn":"strict_ehandle", 
85+                 "assistedflash":"bool", 
86+                 "weapon":"string", 
87+                 "weapon_itemid":"string", 
88+                 "weapon_fauxitemid":"string", 
89+                 "weapon_originalowner_xuid":"string", 
90+                 "headshot":"bool", 
91+                 "dominated":"short", 
92+                 "revenge":"short", 
93+                 "wipe":"short", 
94+                 "penetrated":"short", 
95+                 "noreplay":"bool", 
96+                 "noscope":"bool", 
97+                 "thrusmoke":"bool", 
98+                 "attackerblind":"bool", 
99+                 "distance":"float", 
100+                 "dmg_health":"short", 
101+                 "dmg_armor":"byte", 
102+                 "hitgroup":"byte", 
103+                 "attackerinair":"bool", 
104+                 }),''' 
105+     def  OnPluginLoad (self ):
106+         alog ("successfully loaded" )
107+         pass 
108+     def  _heal (self , who , amount ):
109+         player  =  Source2Py .ADVPlayer (who )
110+         player .AddHealth (amount )
111+     def  _testDeath_old (self , event ):
112+         geks  =  Source2Py .GameEventKeySymbol_t ("userid" )
113+         playerid  =  event .GetPlayerSlot (geks ).Get ()
114+         who_died  =  Source2Py .ADVPlayer (playerid )
115+ 
116+         geks  =  Source2Py .GameEventKeySymbol_t ("attacker" )
117+         attackerid  =  event .GetPlayerSlot (geks ).Get ()
118+         self ._heal (self , attackerid , 35 )
119+ 
120+         geks  =  Source2Py .GameEventKeySymbol_t ("assister" )
121+         assisterid  =  event .GetPlayerSlot (geks ).Get ()
122+         if  (assisterid >= 0 ):
123+             self ._heal (self , attackerid , 5 )
124+ 
125+         alog ("player slot:"  +  str (int (playerid )) +  " name:"  +  str (who_died .GetName ()))
126+         pass 
127+     def  _testDeath_new (self , event ):
128+         ev  =  Event (event )
129+         for  k , v  in  ev .items ():
130+             alog (str (k ) +  "   |   "  +  str (v ))
131+ 
132+         victim  =  Source2Py .ADVPlayer (ev ['userid' ])
133+         attacker  =  Source2Py .ADVPlayer (ev ['attacker' ])
134+         assister  =  Source2Py .ADVPlayer (ev ['assister' ])
135+         
136+         killstring  =  victim .GetName () +  " was killed by " 
137+ 
138+         if  (attacker .IsValid ()):
139+             killstring  =  killstring  +  attacker .GetName ()
140+             heal  =  15 
141+             current_hp  =  attacker .GetHealth ()
142+             alog (str (attacker .GetName () +  " healed by "  +  str (heal ) +  " from "  +  str (current_hp ) +  " to "  +  str (current_hp + heal )))
143+             attacker .AddHealth (15 )
144+ 
145+         if  (assister .IsValid ()):
146+             killstring  =  killstring  +  ", and "  +  assister .GetName ()
147+             heal  =  5 
148+             current_hp  =  assister .GetHealth ()
149+             alog (str (assister .GetName () +  " healed by "  +  str (heal ) +  " from "  +  str (current_hp ) +  " to "  +  str (current_hp + heal )))
150+             assister .AddHealth (5 )
151+ 
152+         alog (killstring )
153+         pass 
154+     def  OnPlayerDeath (self , event ):
155+         alog ("START" )
156+         try :
157+             #self._testDeath_old(self, event) 
158+             self ._testDeath_new (self , event )
159+         except  Exception  as  e :
160+             alog (e )
161+             alog (traceback .format_exc ())
162+         alog ("END" )
163+         pass 
0 commit comments