· 8 years ago · Feb 19, 2018, 01:12 PM
1import es
2import popuplib
3import playerlib
4import gamethread
5import usermsg
6import cfglib
7import cmdlib
8import langlib
9import saytextlib
10
11
12import os
13import random
14import time
15import sys
16
17
18import psyco
19psyco.full()
20
21
22from path import path as Path
23from sqlite3 import dbapi2 as sqlite
24from base64 import encodestring as estr, decodestring as dstr
25from configobj import ConfigObj
26
27
28import logging
29reload(logging)
30
31
32import core
33reload(core)
34from core import *
35
36
37version = 'v0.78.5g.4f Beta'
38author = '['+version+' by kRypT0n!Te & Tha Pwned]'
39game = es.getGameName()
40ragdoll = {'cstrike':'cs_ragdoll', 'hl2dm':'hl2dm_ragdoll', 'tf':'tf_ragdoll', 'dod':'dod_ragdoll'}.get(game)
41
42
43class InI(object):
44 def __init__(self):
45 self.path = es.getAddonPath('wcs')
46
47 self.races = os.path.join(self.path, 'ini', 'races.ini')
48 self._races = os.path.join(self.path, 'ini', '_backupraces.ini')
49 self.items = os.path.join(self.path, 'ini', 'items.ini')
50 self.cats = os.path.join(self.path, 'ini', 'racecats.ini')
51
52 @property
53 def getRaces(self):
54 try:
55 return ConfigObj(self.races)
56 except:
57 sys.excepthook(*sys.exc_info())
58 logging.log('wcs: Error: Unable to load races.ini, there was an error')
59 logging.log('wcs: Information: Loading the backup races...')
60 return ConfigObj(self._races)
61
62 @property
63 def getItems(self):
64 return ConfigObj(self.items)
65
66 @property
67 def getCats(self):
68 return ConfigObj(self.cats)
69ini = InI()
70
71if os.path.isfile(os.path.join(ini.path, 'ini', 'strings.ini')):
72 strings = langlib.Strings(os.path.join(ini.path, 'ini', 'strings.ini'))
73else:
74 logging.log('wcs: Error: Unable to load the strings.ini located in wcs/ini/')
75 strings = lambda x, tokens={}, lang='en': logging.log('wcs: Error: Can\'t find strings.ini inside wcs/ini/')
76
77config = cfglib.AddonCFG(os.path.join(ini.path, 'config', 'config.cfg'))
78
79log = config.cvar('wcs_log', 0, 'Will log specific events (-1 = OFF, 0 = ONLY SHOWS ERRORS, GREATERTHAN 0 = OTHERS)')
80
81interval = config.cvar('wcs_cfg_interval', 80, 'XP required for level up (LEVEL * interval)')
82bonusxp = config.cvar('wcs_cfg_bonusxp', 4, 'Extra XP gained per level diffience (LEVEL * bonusxp) when killing a higher level enemy')
83killxp = config.cvar('wcs_cfg_killxp', 30, 'XP gained per kill')
84knifexp = config.cvar('wcs_cfg_knifexp', 40, 'XP gained for a knife kill')
85headshotxp = config.cvar('wcs_cfg_headshotxp', 15, 'XP gained for making a headshot')
86
87allow_player_hurt = config.cvar('wcs_cfg_allow_player_hurt', 1, 'Allow the player_hurt event for races and items (1 = ON, 0 = OFF)')
88allow_player_spawn = config.cvar('wcs_cfg_allow_player_spawn', 1, 'Allow the player_spawn event for races and items (1 = ON, 0 = OFF)')
89allow_player_death = config.cvar('wcs_cfg_allow_player_death', 1, 'Allow the player_death event for races and items (1 = ON, 0 = OFF)')
90allow_player_kill = config.cvar('wcs_cfg_allow_player_kill', 1, 'Allow the player_kill event for races and items (1 = ON, 0 = OFF)')
91allow_player_attacker = config.cvar('wcs_cfg_allow_player_attacker', 1, 'Allow the player_attacker event for races and items (1 = ON, 0 = OFF)')
92allow_player_victim = config.cvar('wcs_cfg_allow_player_victim', 1, 'Allow the player_victim event for races and items (1 = ON, 0 = OFF)')
93allow_player_say = config.cvar('wcs_cfg_allow_player_say', 1, 'Allow the player_say event for races and items (1 = ON, 0 = OFF)')
94
95welcometext = config.cvar('wcs_cfg_welcometext', 1, 'Welcome text (0 = OFF, 1 = ON), delay of 10 seconds')
96welcomeguitext = config.cvar('wcs_cfg_welcomeguitext', 1, 'Welcome gui text (0 = OFF, 1 = ON), delay of 5 seconds')
97spawntext = config.cvar('wcs_cfg_spawntext', 1, 'Spawn text, showed up every round. Good for new servers with WCS beginners (0 = OFF, 1 = ON)')
98disabletextonlvl = config.cvar('wcs_cfg_disabletextonlvl', 20, 'If a player reaches this level, no welcome/gui/spawn text will appear')
99graphicfx = config.cvar('wcs_cfg_graphicfx', 1, 'Show vissual effect (0 = OFF, 1 = ON)')
100friendlyexplosion = config.cvar('wcs_cfg_friendlyexplosion', 0, 'Set this to 1 if you want explode effects (e.g. Suicide Bomber) to inflict friendly players in range')
101xpsaver = config.cvar('wcs_cfg_savexponround', 5, 'The numbers of rounds before the xp/levels are saved (set to 0 to disable)')
102showracelevel = config.cvar('wcs_cfg_showracelevel', 1, 'Show level on changerace (0 = OFF, 1 = ON)')
103removeragdolls = config.cvar('wcs_cfg_removeragdolls', 0, 'Removes ragdolls from the game (0 = OFF, 1 = ON)')
104allowshopmenu = config.cvar('wcs_cfg_enableshopmenu', 1, 'Shopmenu (0 = OFF, 1 = ON)')
105allowbotsgetxp = config.cvar('wcs_cfg_allowbotsgetxp', 1, 'Allow bots getting XP (0 = OFF, 1 = ON)')
106allowbotsreward = config.cvar('wcs_cfg_allowbotsreward', 1, 'Allow players getting XP by killing bots (0 = OFF, 1 = ON)')
107changerace_mode = config.cvar('wcs_changerace_mode', 1, 'Changerace modus (1 = instant kill, 2 = round end/death)')
108maximumlevelvar = config.cvar('wcs_maximum_level', 1000, 'Maximum level untill for each race untill you can no longer receive exp/levels on this race')
109racecategories = config.cvar('wcs_racecats', 0, 'Enable/Disable race categories(1 = ON; 0 = OFF')
110defaultcategory = config.cvar('wcs_racecats_defaultcategory', 'Default category', 'Default category name. Must be it racecat.ini')
111changerace_racename = config.cvar('wcs_changerace_racename', 1, 'Enable/Disable changerace <race name> feature(1 = ON; 2 = OFF)')
112
113config.write()
114
115cfgdata = {'interval': interval,
116 'bonusxp': bonusxp,
117 'killxp': killxp,
118 'knifexp': knifexp,
119 'headshotxp': headshotxp,
120 'allow_player_hurt': allow_player_hurt,
121 'allow_player_spawn': allow_player_spawn,
122 'allow_player_death': allow_player_death,
123 'allow_player_kill': allow_player_kill,
124 'allow_player_attacker': allow_player_attacker,
125 'allow_player_victim': allow_player_victim,
126 'allow_player_say': allow_player_say}
127
128class itemDatabase(object):
129 def __init__(self):
130 self.items = ini.getItems
131 self.sectionlist = []
132 self.itemlist = []
133 self.itemtosection = {}
134
135 for section in self.items:
136 self.sectionlist.append(section)
137 for item in self.items[section]:
138 if item == 'desc':
139 continue
140
141 self.itemlist.append(item)
142 self.itemtosection[item] = section
143
144 def __contains__(self, item):
145 return item in self.items
146
147 def __iter__(self):
148 for x in self.items:
149 yield x
150
151 def __getitem__(self, item):
152 return self.items[item]
153
154 def keys(self):
155 return self.items.keys()
156
157 def getSection(self, section):
158 return dict(self.items[section])
159
160 def getItem(self, item):
161 return dict(self.items[self.getSectionFromItem(item)][item])
162
163 def getSections(self):
164 return list(self.sectionlist)
165
166 def getItems(self):
167 return list(self.itemlist)
168
169 def getSectionFromItem(self, item):
170 if item in self.itemtosection:
171 return self.itemtosection[item]
172
173 return None
174
175 def getAll(self):
176 return dict(self.items)
177itemdb = itemDatabase()
178
179class raceDatabase(object):
180 def __init__(self):
181 self.races = ini.getRaces
182
183 def __contains__(self, race):
184 return race in self.races
185
186 def __iter__(self):
187 for x in self.races:
188 yield x
189
190 def getRace(self, race):
191 return self.races[race]
192
193 def getAll(self):
194 return self.races
195
196 def getAlias(self):
197 return aliass
198
199 def index(self, race):
200 return self.races.keys().index(race)
201racedb = raceDatabase()
202
203class RaceCategories(object):
204 def __init__(self):
205 self.cats = ini.getCats
206 self.catslist = []
207 self.defaultcat = defaultcategory
208
209 for cat in self.cats:
210 self.catslist.append(cat)
211
212 def getCategory(self, cat):
213 return dict(self.cats[cat])
214
215 def getAll(self):
216 return dict(self.cats)
217
218 def getCategories(self):
219 return list(self.catslist)
220
221 def getAllWithRaces(self, cat):
222 allraces = ini.getRaces.keys()
223 categories = {}
224 for race in allraces:
225 raceinfo = racedb.getRace(race)
226 raceinfo = dict(raceinfo)
227 if raceinfo.has_key('racecategory'):
228 for category in raceinfo['racecategory'].split('|'):
229 if categories.has_key(cat):
230 categories[cat].append(race)
231 else:
232 categories[cat] = []
233 else:
234 categories[self.defaultcat].append(race)
235
236 return categories
237
238 def getRacesInCategories(self, cat):
239 allraces = racedb.getAll().keys()
240 category = list(self.catslist)[cat]
241 listofraces=[]
242 for race in allraces:
243 raceinfo = racedb.getRace(race)
244 raceinfo = dict(raceinfo)
245 if raceinfo.has_key('racecategory'):
246 if str(category) in raceinfo['racecategory'].split('|'):
247 listofraces.append(race)
248 #elif str(category) == str(self.defaultcat):
249 elif str(category) == str(defaultcategory):
250 listofraces.append(race)
251 if len(listofraces):
252 return listofraces
253 return None
254racecats = RaceCategories()
255
256
257if len(racedb.getAll()):
258 standardrace = racedb.getAll().keys()[0]
259else:
260 logging.log('No races found in ini/races.ini')
261 raise NotImplementedError
262info = es.AddonInfo()
263
264
265
266
267info.author = author
268
269#Thanks to Freddukes for this!
270class SQLiteManager(object):
271 def __init__(self, pathFile):
272 if isinstance(pathFile, Path):
273 self.pathFile = pathFile
274 else:
275 self.pathFile = Path(pathFile)
276
277 self.connection = sqlite.connect(self.pathFile.joinpath('players.sqlite'))
278 self.cursor = self.connection.cursor()
279
280 self.connection.text_factory = str
281 self.execute("PRAGMA synchronous=NORMAL")
282 #self.execute("PRAGMA journal_mode=OFF")
283 self.execute("PRAGMA locking_mode=EXCLUSIVE")
284 self.execute("PRAGMA auto_vacuum=FULL")
285
286 self.execute("""\
287 CREATE TABLE IF NOT EXISTS Players (
288 UserID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
289 steamid VARCHAR(30) NOT NULL,
290 currace VARCHAR(30) NOT NULL,
291 name VARCHAR(30) NOT NULL,
292 totallevel INTEGER DEFAULT 0,
293 lastconnect INTEGER
294 )""")
295
296 self.execute("CREATE INDEX IF NOT EXISTS playersIndex ON Players(steamid)")
297
298 self.execute("""\
299 CREATE TABLE IF NOT EXISTS Races (
300 RaceID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
301 UserID INTEGER NOT NULL,
302 name VARCHAR(50) NOT NULL,
303 skills VARCHAR(50) NOT NULL,
304 level INTEGER DEFAULT 0,
305 xp INTEGER DEFAULT 0,
306 unused INTEGER DEFAULT 0
307 )""")
308
309 self.execute("CREATE INDEX IF NOT EXISTS racesIndex ON Races(UserID)")
310
311 def __len__(self):
312 self.execute("SELECT COUNT(*) FROM Players")
313 return int(self.cursor.fetchone()[0])
314
315 def __contains__(self, user):
316 if isinstance(user, (long, int)): #Tha Pwned
317 self.execute("SELECT steamid FROM Players WHERE UserID = ?", (user, ))
318 else:
319 self.execute("SELECT steamid FROM Players WHERE steamid = ?", (user, ))
320 return bool(self.cursor.fetchone())
321
322 #def __del__(self): #Tha Pwned (just remove the 3 lines here)
323 # self.save()
324 # self.close()
325
326 def execute(self, statement, args=None):
327 if args is None:
328 self.cursor.execute(statement)
329 else:
330 self.cursor.execute(statement, args)
331
332 def fetchone(self):
333 result = self.cursor.fetchone()
334 if hasattr(result, '__iter__'):
335 if len(result) == 1:
336 return result[0]
337 return result
338
339 def fetchall(self):
340 trueValues = []
341 for value in self.cursor.fetchall():
342 if isinstance(value, tuple):
343 if len(value) > 1:
344 trueValues.append(value)
345 else:
346 trueValues.append(value[0])
347 else:
348 trueValues.append(value)
349 return trueValues
350
351 def save(self):
352 self.connection.commit()
353
354 def close(self):
355 self.cursor.close()
356 self.connection.close()
357
358 def getUserIdFromSteamId(self, steamid):
359 self.execute("SELECT UserID FROM Players WHERE steamid = ?", (steamid, ))
360 value = self.cursor.fetchone()
361 if value is None:
362 return None
363
364 return value[0]
365
366 def addPlayer(self, steamid, name):
367 self.execute("INSERT INTO Players (steamid, currace, name, totallevel, lastconnect) VALUES (?,?,?,0,?)", (steamid, standardrace, self.removeWarnings(name), time.time())) #Tha Pwned
368 return self.cursor.lastrowid
369
370 def getRaceIdFromUserIdAndRace(self, userid, race):
371 if not isinstance(userid, (long, int)): #Tha Pwned
372 userid = self.getUserIdFromSteamId(userid)
373
374 self.execute("SELECT RaceID FROM Races WHERE UserID = ? AND name = ?", (userid, race))
375 value = self.cursor.fetchone()
376 if value is None:
377 return None
378
379 return value[0]
380
381 def addRaceIntoPlayer(self, userid, name):
382 if not isinstance(userid, (long, int)): #Tha Pwned
383 userid = self.getUserIdFromSteamId(userid)
384
385 self.execute("INSERT INTO Races (UserID, name, skills) VALUES (?,?,'')", (userid, name)) #Tha Pwned
386 return self.cursor.lastrowid
387
388 def updateRank(self):
389 self.execute("SELECT steamid FROM Players ORDER BY totallevel DESC")
390 results = self.cursor.fetchall()
391 self.ranks = []
392
393 for steamid in results:
394 self.ranks.append(steamid[0])
395
396 def getRank(self, steamid):
397 if steamid in self.ranks:
398 return self.ranks.index(steamid) + 1
399 return self.__len__()
400
401 def removeWarnings(self, value):
402 return str(value).replace("'", "").replace('"', '')
403#database = SQLiteManager(Path(es.getAddonPath('wcs')))
404database = SQLiteManager(Path(ini.path).joinpath('data'))
405
406
407tmp = {}
408#def getPlayer(userid):
409#def getPlayer(userid, steamid, name):
410def getPlayer(userid):
411 userid = int(userid)
412 if not userid in tmp:
413 tmp[userid] = PlayerObject(userid)
414 #tmp[userid] = PlayerObject(userid, steamid, name)
415 return tmp[userid]
416
417
418class PlayerObject(object):
419 #def __init__(self, userid, steamid, name):
420 def __init__(self, userid):
421 self.userid = userid
422 if not es.exists('userid', self.userid):
423 logging.log('wcs: Error: Unknown userid: '+str(self.userid))
424 raise NotImplementedError, 'Unknown userid: '+str(self.userid)
425 self.steamid = playerlib.uniqueid(self.userid, True)
426 #self.steamid = steamid
427 self.UserID = database.getUserIdFromSteamId(self.steamid)
428
429 if self.UserID is None:
430 self.UserID = database.addPlayer(self.steamid, es.getplayername(self.userid))
431 #self.UserID = database.addPlayer(self.steamid, name)
432
433 self.player = _getPlayer(self.userid, self.UserID)
434 #self.race = Race(self.UserID, self.player.getInfo('currace'))
435 self.race = _getRace(self.UserID, self.player.currace, self.userid)
436
437 def __del__(self):
438 self.save()
439
440 def __str__(self):
441 return str(self.userid)
442
443 def __int__(self):
444 return self.userid
445
446 def save(self):
447 self.player.save()
448 self.race.save()
449
450 def changeRace(self, race, kill=True):
451 self.race.save()
452
453 if self.race.racedb['onchange']:
454 es.ServerVar('wcs_userid').set(self.userid)
455 es.server.insertcmd(self.race.racedb['onchange'])
456
457 oldrace = self.player.currace
458
459 self.player.currace = str(race)
460
461 self.race = _getRace(self.UserID, race, self.userid)
462 self.race.update()
463 self.race.refresh()
464 self.race.save()
465
466 if kill:
467 expand.damage(self.userid, '#health', self.userid)
468 #if es.isbot(self.userid):
469 # es.server.queuecmd('bot_kill '+es.getplayername(self.userid))
470 #else:
471 # es.server.queuecmd('es_xsexec '+str(self.userid)+' kill')
472
473 events.Event('wcs_changerace').set({'userid':self.userid,'oldrace':oldrace,'newrace':race}).fire()
474
475 def giveXp(self, amount, reason=''):
476 return self.race.addXp(amount, reason)
477
478 def giveLevel(self, amount):
479 return self.race.addLevel(amount)
480
481 def giveUnused(self, amount):
482 return self.race.addUnused(amount)
483
484 def givePoint(self, skill):
485 return self.race.addPoint(skill)
486
487 def showXp(self):
488 xp = self.race.xp
489 level = self.race.level
490 needed = int(cfgdata['interval'])*level if level else int(cfgdata['interval'])
491 race = self.player.currace
492
493 tell(self.userid, 'main: xp needed', {'race':race,'level':level,'xp':xp,'needed':needed})
494
495 def showRank(self):
496 name = self.player.name
497 race = self.player.currace
498 level = self.race.level
499 place = database.getRank(self.steamid)
500 total = str(len(database))
501 xp = self.race.xp
502 needed = int(cfgdata['interval'])*level if level else int(cfgdata['interval'])
503 unused = self.race.unused
504
505 for user in es.getUseridList():
506 tell(user, 'main: show rank', {'name':name,'race':race,'level':level,'place':place,'total':total,'xp':xp,'needed':needed,'unused':unused})
507
508 def delRace(self):
509 self.player.totallevel -= int(self.race.level)
510 database.execute("DELETE FROM Races WHERE UserID = ? AND name = ?", (self.UserID, self.player.currace))
511 self.race.level = 0
512 self.race.xp = 0
513 self.race.skills = ''
514 self.race.unused = 0
515 self.race.refresh()
516 self.race.save()
517 #self.race = _getRace(self.UserID, self.player.currace, self.userid)
518
519 def delPlayer(self):
520 database.execute('DELETE FROM Players WHERE UserID = ?', (self.player.UserID, ))
521 database.execute('DELETE FROM Races WHERE UserID = ?', (self.player.UserID, ))
522
523 del tmp1[self.userid]
524 del tmp2[self.userid]
525
526 self.player = _getPlayer(self.userid, self.UserID)
527 self.race = _getRace(self.UserID, self.player.currace, self.userid)
528
529 #self.player.save()
530 #self.player.update()
531
532 #self.race.update()
533 self.race.refresh()
534 #self.race.save()
535
536 #self.__init__(self.userid)
537info.name = 'Wcs'
538
539tmp1 = {}
540def _getPlayer(userid, UserID):
541 userid = int(userid)
542 if not userid in tmp1:
543 tmp1[userid] = Player(userid, UserID)
544
545 return tmp1[userid]
546
547class Player(object):
548 def __init__(self, userid, UserID):
549 self.userid = userid
550 self.UserID = UserID
551 self.update()
552
553 def update(self):
554 self.steamid, self.currace, self.name, self.totallevel, self.lastconnect = self._getInfo(('steamid',
555 'currace',
556 'name',
557 'totallevel',
558 'lastconnect'))
559
560 self.name = database.removeWarnings(self.name)
561
562 def save(self):
563 try:
564 self._setInfo({'steamid':self.steamid,
565 'currace':self.currace,
566 'name':self.name,
567 'totallevel':self.totallevel,
568 'lastconnect':self.lastconnect})
569 except:
570 logging.log('wcs: Information: Unable to set information for UserID '+str(self.UserID))
571 logging.log('wcs: Information: Error message: '+str(sys.exc_info()[1]))
572 logging.log('wcs: Information: Possible errors: '+str(self.steamid)+' '+str(self.currace)+' '+str(self.name)+' '+str(self.totallevel)+' '+str(self.lastconnect))
573
574 def _getInfo(self, what):
575 if not hasattr(what, '__iter__'):
576 what = (what, )
577
578 database.execute("SELECT "+','.join(map(str, what))+" FROM Players WHERE UserID = ?", (self.UserID, ))
579
580 v = database.fetchone()
581 if v is None:
582 return (es.getplayersteamid(self.userid), standardrace, es.getplayername(self.userid), 0, time.time())
583
584 return v
585
586 def _setInfo(self, options):
587 keys = []
588 for option, value in options.iteritems():
589 keys.append((option+"='"+str(value)+"'"))
590
591 database.execute("UPDATE Players SET " + ','.join(keys) + " WHERE UserID = ?", (self.UserID, ))
592
593tmp2 = {}
594def _getRace(userid, race, user):
595 user = int(user)
596 if not user in tmp2:
597 tmp2[user] = {}
598
599 if not race in tmp2[user]:
600 tmp2[user][race] = Race(userid, race, user)
601
602 return tmp2[user][race]
603
604class Race(object):
605 def __init__(self, UserID, race, user):
606 self.userid = user
607 self.steamid = es.getplayersteamid(self.userid)
608 self.UserID = UserID
609 self.player = _getPlayer(self.userid, self.UserID)
610
611 if not race in racedb:
612 tell(self.userid, 'main: race no found', {'race':race})
613 #es.tell(self.userid, '#multi', '#greenIt seems like your current race ('+race+') is #lightgreennot #greenin the database.')
614 logging.log('wcs: Information: Unknown race ('+race+') found on UserID '+str(self.UserID))
615 race = standardrace
616 self.player.currace = standardrace
617
618 self.RaceID = database.getRaceIdFromUserIdAndRace(self.UserID, race)
619 if self.RaceID is None:
620 self.RaceID = database.addRaceIntoPlayer(self.UserID, race)
621
622 self.racedb = racedb.getRace(race)
623
624 self.update()
625 self.refresh()
626
627 def __contains__(self, race):
628 if isinstance(race, int):
629 database.execute("SELECT RaceID FROM Races WHERE UserID = ? AND RaceID = ?", (self.UserID, race))
630 else:
631 database.execute("SELECT RaceID FROM Races WHERE UserID = ? AND name = ?", (self.UserID, race))
632 return database.fetchone()
633
634 def update(self):
635 self.name, self.skills, self.level, self.xp, self.unused = self._getInfo(('name',
636 'skills',
637 'level',
638 'xp',
639 'unused'))
640
641 def save(self):
642 try:
643 self._setInfo({'name':self.name,
644 'skills':self.skills,
645 'level':self.level,
646 'xp':self.xp,
647 'unused':self.unused})
648 except:
649 logging.log('wcs: Information: Unable to set information for UserID '+str(self.UserID))
650 logging.log('wcs: Information: Error message: '+str(sys.exc_info()[1]))
651 logging.log('wcs: Information: Possible errors: '+str(self.name)+' '+str(self.skills)+' '+str(self.level)+' '+str(self.xp)+' '+str(self.unused))
652
653 def refresh(self):
654 if not self.skills or self.skills is None or self.skills == 'None':
655 skills = []
656 for x in xrange(1,10):
657 skill = 'skill'+str(x)
658 if skill in self.racedb:
659 skills.append('0')
660
661 self.skills = '|'.join(skills)
662
663 def _getInfo(self, what):
664 if not hasattr(what, '__iter__'):
665 what = (what, )
666
667 database.execute("SELECT "+','.join(map(str, what))+" FROM Races WHERE UserID = ? AND RaceID = ?", (self.UserID, self.RaceID))
668
669 v = database.fetchone()
670 if v is None:
671 return (self.player.currace, '', 0, 0, 0)
672
673 return v
674
675 def _setInfo(self, options):
676 keys = []
677 for option, value in options.iteritems():
678 keys.append((option+"='"+str(value)+"'"))
679
680 database.execute("UPDATE Races SET " + ','.join(keys) + " WHERE UserID = ? AND RaceID = ?", (self.UserID, self.RaceID))
681
682
683 def addXp(self, amount, reason=''):
684 amount = int(amount)
685 if not amount:
686 return
687
688 maximumlevel = int(maximumlevelvar) #Tha Pwned
689
690 if 'maximumlevel' in self.racedb: #Tha Pwned
691 maximumlevel = int(self.racedb['maximumlevel']) #Tha Pwned
692
693 if self.level >= maximumlevel: #Tha Pwned
694 return #Tha Pwned
695
696 currentXp = self.xp + amount
697
698 amountOfLevels = 0
699 nextLevelXp = int(cfgdata['interval'])*self.level if self.level else int(cfgdata['interval'])
700
701 while currentXp >= nextLevelXp:
702 amountOfLevels += 1
703 currentXp -= nextLevelXp
704 nextLevelXp += int(cfgdata['interval'])
705
706 self.xp = currentXp
707
708 if es.exists('userid', self.userid):
709 tell(self.userid, 'main: gain xp', {'amount':amount}, (' '+reason) if reason else '')
710
711 if amountOfLevels+self.level >= maximumlevel: #Tha Pwned
712 amountOfLevels = maximumlevel-self.level #Tha Pwned
713
714 if amountOfLevels:
715 self.addLevel(amountOfLevels)
716
717 events.Event('wcs_gainxp').set({'userid':self.userid,'amount':amount,'levels':amountOfLevels,'currentxp':self.xp,'reason':reason}).fire()
718
719 return currentXp
720
721 def addLevel(self, amount):
722 amount = int(amount)
723 if not amount:
724 return
725
726 maximumlevel = 100 #Tha Pwned
727
728 if 'maximumlevel' in self.racedb: #Tha Pwned
729 maximumlevel = int(self.racedb['maximumlevel']) #Tha Pwned
730
731 if self.level >= maximumlevel: #Tha Pwned
732 return #Tha Pwned
733
734 if amount+self.level >= maximumlevel: #Tha Pwned
735 amount = maximumlevel-self.level #Tha Pwned
736
737 self.level += amount
738 self.unused += amount
739 self.player.totallevel += amount
740
741 if 'BOT' in self.steamid:
742 maxlevel = int(self.racedb['numberoflevels'])
743
744 while True:
745 if not self.unused:
746 break
747
748 possibleChoices = []
749 skills = self.skills.split('|')
750
751 if len(skills):
752 if skills[0] == '':
753 self.raceUpdate()
754
755 for skill, level in enumerate(skills):
756 if int(skills[skill]) < maxlevel:
757 possibleChoices.append(str(skill+1))
758
759 if not len(possibleChoices):
760 break
761
762 choice = random.choice(possibleChoices)
763 self.addPoint(choice)
764
765 else:
766 if es.exists('userid', self.userid):
767 tell(self.userid, 'main: level gain', {'level':self.level,'xp':self.xp,'needed':self.level*int(cfgdata['interval'])})
768
769 gamethread.delayed(2, sendPopup, (spendskills.doCommand, self.userid))
770 #gamethread.delayed(2, spendskills.doCommand, self.userid)
771
772 if es.exists('userid', self.userid):
773 if es.getplayerprop(self.userid, 'CBasePlayer.pl.deadflag'):
774 es.playsound(self.userid, 'ambient/machines/teleport1.wav', 0.4)
775 else:
776 es.emitsound('player', self.userid, 'ambient/machines/teleport1.wav', 0.8, 0.3)
777
778 if graphicfx:
779 x,y,z = es.getplayerlocation(self.userid)
780 effect.effect.BlueCircle((x,y,z+38), BaseSpread=28, Rate=173, RenderColor=(252,232,131), Twist=15, Delayed=3.5, Userid=self.userid)
781
782 events.Event('wcs_levelup').set({'userid':self.userid,'race':self.name,'oldlevel':self.level-amount,'newlevel':self.level,'amount':amount}).fire()
783
784 return self.level
785
786 def addUnused(self, amount):
787 self.unused += amount
788 return self.unused
789
790 def addPoint(self, skill):
791 skills = self.skills.split('|')
792 index = int(skill)-1
793 level = int(skills[index])
794
795 if self.unused:
796 skills.pop(index)
797 skills.insert(index, str(level+1))
798
799 self.skills = '|'.join(skills)
800
801 self.unused -= 1
802
803 return level+1
804
805class cmdlibRegister(object):
806 def __init__(self):
807 self.timed = {}
808
809 @staticmethod
810 def changerace(userid, args):
811 changerace.HowChange(userid, args)
812
813
814 @staticmethod
815 def showxp(userid, args=None):
816 getPlayer(userid).showXp()
817
818 @staticmethod
819 def playerinfo(userid, args=None):
820 playerinfo.doCommand(userid)
821
822 @staticmethod
823 def wcsrank(userid, args=None):
824 wcstop.wcsRank(userid, ' '.join(map(str, args)))
825
826 @staticmethod
827 def wcstop(userid, args=None):
828 wcstop.doCommand(userid, 'wcstop')
829
830 @staticmethod
831 def spendskills(userid, args=None):
832 spendskills.doCommand(userid)
833
834 @staticmethod
835 def resetskills(userid, args=None):
836 resetskills.doCommand(userid)
837
838 @staticmethod
839 def wcsmenu(userid, args=None):
840 wcsmenu.doCommand(userid)
841
842 @staticmethod
843 def wcshelp(userid, args=None):
844 wcshelp.doCommand(userid)
845
846 @staticmethod
847 def raceinfo(userid, args=None):
848 raceinfo.doCommand(userid, 'raceinfo0', False)
849
850 @staticmethod
851 def savexp(userid, args=None):
852 savexp.doCommand(userid)
853
854 @staticmethod
855 def showskills(userid, args=None):
856 showskills.doCommand(userid)
857
858 @staticmethod
859 def shopmenu(userid, args=None):
860 if allowshopmenu:
861 shopmenu.doCommand(userid, 'shopmenu')
862
863 @staticmethod
864 def shopinfo(userid, args=None):
865 if allowshopmenu:
866 shopinfo.doCommand(userid)
867
868 def reloadRaces(self, args):
869 if not 'reload' in self.time:
870 self.time['reload'] = time.time()
871
872 if time.time()-self.time['reload'] <= 180:
873 racedb.races = ini.getRaces
874 self.time['reload'] = time.time()
875 logging.log('wcs: Information: Successfully reloaded the races.ini file')
876cmdreg = cmdlibRegister()
877
878
879class CfgManager(object):
880 def __init__(self, name):
881 self.name = name
882
883 self.cfg = cfglib.AddonCFG(os.path.join(ini.path, 'config', self.name+'.cfg'))
884
885 def __getattr__(self, attr):
886 return getattr(self.cfg, attr)
887
888
889class EventManager(object):
890 def __init__(self, file):
891 self.file = str(file)+'.res' if not str(file).endswith('.res') else ''
892 self.load()
893
894 def load(self):
895 es.loadevents('declare', 'addons/eventscripts/wcs/events/'+self.file)
896
897 def Event(self, event):
898 return Event(event)
899
900
901class Event(object):
902 def __init__(self, name):
903 self.name = name
904 es.event('initialize', self.name)
905
906 def set(self, options={}):
907 for item, value in options.iteritems():
908 if str(value).isdigit():
909 es.event('setint', self.name, item, int(value))
910 else:
911 try:
912 es.event('setfloat', self.name, item, float(value))
913 except ValueError:
914 if value:
915 es.event('setstring', self.name, item, str(value))
916 else:
917 es.event('setstring', self.name, item, '0')
918
919 return self
920
921 def fire(self):
922 es.event('fire', self.name)
923
924 def cancel(self):
925 es.event('cancel', self.name)
926
927
928
929
930
931def player_changename(ev):
932 if es.exists('userid', ev['userid']):
933 getPlayer(ev['userid']).player.name = database.removeWarnings(ev['newname'])
934
935def player_activate(ev):
936 userid = str(ev['userid'])
937 if es.exists('userid', userid):
938 player = getPlayer(userid)
939 player.player.name = database.removeWarnings(ev['es_username'])
940
941 if not str(ev['es_steamid']).lower() == 'bot':
942 if welcomeguitext and player.player.totallevel <= disabletextonlvl:
943 gamethread.delayed(5, sendPopup, (welcome.doCommand, userid))
944 #gamethread.delayed(5, welcome.doCommand, userid)
945 if welcometext and player.player.totallevel <= disabletextonlvl:
946 gamethread.delayed(10, tell, (userid, 'main: welcome'))
947 gamethread.delayed(15, tell, (userid, 'main: siteadvert'))
948
949 wcsgroup.addUser(userid)
950
951def player_disconnect(ev):
952 userid = int(ev['userid'])
953
954 if userid in tmp:
955 tmp[userid].player.lastconnect = time.time()
956 tmp[userid].player.name = database.removeWarnings(ev['es_username'])
957 tmp[userid].save()
958 tmp1[userid].save()
959 for x in tmp2[userid]:
960 tmp2[userid][x].save()
961
962 del tmp[userid]
963 del tmp1[userid]
964 del tmp2[userid]
965
966 wcsgroup.delUser(userid)
967
968def round_start(ev):
969 for user in es.getUseridList():
970 if int(es.getplayerteam(user)) >= 2:
971 race = getPlayer(user).player.currace
972 raceinfo = racedb.getRace(race)
973 if raceinfo['roundstartcmd']:
974 es.server.insertcmd(raceinfo['roundstartcmd'])
975
976 dod_round_start(ev)
977
978saved = 0
979
980def round_end(ev):
981 for user in es.getUseridList():
982 if int(es.getplayerteam(user)) >= 2:
983 race = getPlayer(user).player.currace
984 raceinfo = racedb.getRace(race)
985 if raceinfo['roundendcmd']:
986 es.server.insertcmd(raceinfo['roundendcmd'])
987
988 dod_round_start(ev)
989
990 if xpsaver:
991 global saved
992 if xpsaver >= saved:
993 for x in tmp:
994 tmp[x].save()
995
996 for x in tmp1:
997 tmp1[x].save()
998
999 for x in tmp2:
1000 for q in tmp2[x]:
1001 tmp2[x][q].save()
1002
1003 database.save()
1004 saved = 0
1005
1006 else:
1007 saved += 1
1008
1009def round_freeze_end(ev):
1010 dod_round_active(ev)
1011
1012def dod_round_start(ev):
1013 global gamestarted
1014 gamestarted = 0
1015 es.ServerVar('wcs_gamestarted').set(0)
1016
1017def dod_round_active(ev):
1018 global gamestarted
1019 gamestarted = 1
1020 es.ServerVar('wcs_gamestarted').set(1)
1021
1022def player_death(ev):
1023 victim = int(ev['userid'])
1024 attacker = int(ev['attacker'])
1025
1026 if attacker and victim and es.exists('userid', victim) and es.exists('userid', attacker):
1027 player = getPlayer(victim)
1028
1029 if not victim == attacker:
1030 if not ev['es_userteam'] == ev['es_attackerteam']:
1031 if (not (ev['es_steamid'] == 'BOT' and not allowbotsreward)) and (not (ev['es_attackersteamid'] == 'BOT' and not allowbotsgetxp)):
1032 player1 = getPlayer(attacker)
1033 bonus = 0
1034 if player1.race.level < player.race.level:
1035 diffience = player.race.level - player1.race.level
1036 bonus = diffience * int(cfgdata['bonusxp'])
1037
1038 if bonus:
1039 gamethread.delayed(1, player1.giveXp, (int(cfgdata['killxp'])+bonus, strings('main: reason: higher level', {'diffience':diffience}, playerlib.getPlayer(attacker).get('lang'))))
1040 else:
1041 gamethread.delayed(1, player1.giveXp, (int(cfgdata['killxp']), strings('main: reason: make kill', {}, playerlib.getPlayer(attacker).get('lang'))))
1042
1043 if ev['headshot'] == '1':
1044 gamethread.delayed(1, player1.giveXp, (int(cfgdata['headshotxp']), strings('main: reason: make headshot', {}, playerlib.getPlayer(attacker).get('lang'))))
1045 elif ev['weapon'] == 'knife':
1046 gamethread.delayed(1, player1.giveXp, (int(cfgdata['knifexp']), strings('main: reason: make knife', {}, playerlib.getPlayer(attacker).get('lang'))))
1047
1048 if int(cfgdata['allow_player_death']):
1049 checkEvent(victim, 'player_death')
1050 if int(cfgdata['allow_player_kill']):
1051 checkEvent(attacker, 'player_kill')
1052
1053 if player.race.racedb['deathcmd']:
1054 es.server.insertcmd(player.race.racedb['deathcmd'])
1055
1056 if victim and es.exists('userid', victim):
1057 for i, v in {'gravity':1.0,'speed':1.0,'longjump':0}.iteritems():
1058 wcsgroup.setUser(victim, i, v)
1059
1060 expand.gravity(victim, 1)
1061
1062 playerlib.getPlayer(victim).setColor(255, 255, 255, 255)
1063
1064 if removeragdolls:
1065 if ragdoll:
1066 es.fire(es.getuserid(), ragdoll, 'kill')
1067
1068
1069def player_hurt(ev):
1070 victim = int(ev['userid'])
1071 attacker = int(ev['attacker'])
1072
1073 if attacker and victim and es.exists('userid', victim) and es.exists('userid', attacker) and not ev['weapon'].lower() in ('point_hurt'):
1074 if not victim == attacker:
1075 if not ev['es_userteam'] == ev['es_attackerteam']:
1076 if int(cfgdata['allow_player_victim']):
1077 checkEvent(victim, 'player_victim')
1078 if int(cfgdata['allow_player_attacker']):
1079 checkEvent(attacker, 'player_attacker')
1080
1081 if int(cfgdata['allow_player_hurt']):
1082 checkEvent(victim, 'player_hurt')
1083 checkEvent(attacker, 'player_hurt')
1084
1085
1086
1087def player_spawn(ev):
1088 userid = int(ev['userid'])
1089 team = int(ev['es_userteam'])
1090
1091 if userid and team >= 2 and es.exists('userid', userid):
1092 for i, v in {'gravity':1.0,'speed':1.0,'longjump':0}.iteritems():
1093 wcsgroup.setUser(userid, i, v)
1094
1095 expand.gravity(userid, 1)
1096
1097 playerlib.getPlayer(userid).setColor(255, 255, 255, 255)
1098
1099 player = getPlayer(userid)
1100
1101 if not str(ev['es_steamid']).lower() == 'bot':
1102 if spawntext and player.player.totallevel <= disabletextonlvl:
1103 tell(userid, 'main: help text')
1104
1105 wcsgroup.addUser(userid)
1106
1107 player.showXp()
1108
1109 #player.raceUpdate()
1110 if int(cfgdata['allow_player_spawn']):
1111 checkEvent(userid, 'player_spawn')
1112
1113 race = player.player.currace
1114 raceinfo = racedb.getRace(race)
1115 if int(raceinfo['restrictteam']) and not ev['es_steamid'] == 'BOT':
1116 if team == int(raceinfo['restrictteam']) and team >= 2 and not ev['es_steamid'] == 'BOT':
1117 tell(userid, 'main: race restricted team', {'race':race, 'team':{2:'T',3:'CT'}[team]})
1118 es.server.queuecmd('es_xchangeteam '+str(userid)+' 1')
1119 #es.changeteam(userid, 1)
1120 changerace.doCommand(userid, 'changerace')
1121 wcsgroup.setUser(userid, 'restrictteam', team)
1122
1123 elif 'teamlimit' in raceinfo and not ev['es_steamid'] == 'BOT':
1124 q = int(raceinfo['teamlimit'])
1125 if q:
1126 v = wcsgroup.getUser({2:'T',3:'CT'}[team], 'restricted')
1127 if v > q:
1128 tell(userid, 'main: race team limit', {'race':race, 'team':{2:'T',3:'CT'}[team]})
1129 es.server.queuecmd('es_xchangeteam '+str(userid)+' 1')
1130 #es.changeteam(userid, 1)
1131 changerace.doCommand(userid, 'changerace')
1132 #wcsgroup.setUser(userid, 'restricted', team)
1133
1134 elif curmap in raceinfo['restrictmap'].split('|'):
1135 if not ev['es_steamid'] == 'BOT':
1136 tell(userid, 'main: race restricted map', {'race':race, 'map':curmap})
1137 es.server.queuecmd('es_xchangeteam '+str(userid)+' 1')
1138 #es.changeteam(userid, 1)
1139 changerace.doCommand(userid, 'changerace')
1140 #wcsgroup.setUser(userid, 'restricted', team)
1141
1142 if raceinfo['spawncmd']:
1143 es.server.insertcmd(raceinfo['spawncmd'])
1144
1145def server_shutdown(ev):
1146 for x in es.getUseridList():
1147 savexp.doCommand(x, False)
1148
1149 tmp.clear()
1150 tmp1.clear()
1151 tmp2.clear()
1152
1153 database.save()
1154 database.close()
1155
1156def backwards(name):
1157 return dstr(dstr(dstr(name)))
1158
1159def player_say(ev):
1160 userid = ev['userid']
1161
1162 if int(cfgdata['allow_player_say']):
1163 checkEvent(userid, 'player_say')
1164
1165DATABASE_STORAGE_METHOD = SQLiteManager
1166
1167
1168
1169raceevents = {}
1170aliass = {}
1171database = None
1172databasePath = Path(ini.path).joinpath('data')
1173events = EventManager('events')
1174
1175def load():
1176 global database
1177 config.execute()
1178
1179 database = DATABASE_STORAGE_METHOD(databasePath)
1180
1181 database.updateRank()
1182
1183 admin.admins.load()
1184 group.groups.load()
1185
1186 cmdlib.registerClientCommand('changerace', cmdreg.changerace, '')
1187 cmdlib.registerClientCommand('showxp', cmdreg.showxp, '')
1188 cmdlib.registerClientCommand('playerinfo', cmdreg.playerinfo, '')
1189 cmdlib.registerClientCommand('wcsrank', cmdreg.wcsrank, '')
1190 cmdlib.registerClientCommand('wcstop', cmdreg.wcstop, '')
1191 cmdlib.registerClientCommand('spendskills', cmdreg.spendskills, '')
1192 cmdlib.registerClientCommand('resetskills', cmdreg.resetskills, '')
1193 cmdlib.registerClientCommand('wcsmenu', cmdreg.wcsmenu, '')
1194 cmdlib.registerClientCommand('wcshelp', cmdreg.wcshelp, '')
1195 cmdlib.registerClientCommand('wcs', cmdreg.wcsmenu, '')
1196 cmdlib.registerClientCommand('raceinfo', cmdreg.raceinfo, '')
1197 cmdlib.registerClientCommand('savexp', cmdreg.savexp, '')
1198 cmdlib.registerClientCommand('showskills', cmdreg.showskills, '')
1199 cmdlib.registerClientCommand('shopmenu', cmdreg.shopmenu, '')
1200 cmdlib.registerClientCommand('shopinfo', cmdreg.shopinfo, '')
1201 cmdlib.registerSayCommand('changerace', cmdreg.changerace, '')
1202 cmdlib.registerSayCommand('showxp', cmdreg.showxp, '')
1203 cmdlib.registerSayCommand('playerinfo', cmdreg.playerinfo, '')
1204 cmdlib.registerSayCommand('wcsrank', cmdreg.wcsrank, '')
1205 cmdlib.registerSayCommand('wcstop', cmdreg.wcstop, '')
1206 cmdlib.registerSayCommand('spendskills', cmdreg.spendskills, '')
1207 cmdlib.registerSayCommand('resetskills', cmdreg.resetskills, '')
1208 cmdlib.registerSayCommand('wcsmenu', cmdreg.wcsmenu, '')
1209 cmdlib.registerSayCommand('wcshelp', cmdreg.wcshelp, '')
1210 cmdlib.registerSayCommand('wcs', cmdreg.wcsmenu, '')
1211 cmdlib.registerSayCommand('raceinfo', cmdreg.raceinfo, '')
1212 cmdlib.registerSayCommand('savexp', cmdreg.savexp, '')
1213 cmdlib.registerSayCommand('showskills', cmdreg.showskills, '')
1214 cmdlib.registerSayCommand('shopmenu', cmdreg.shopmenu, '')
1215 cmdlib.registerSayCommand('shopinfo', cmdreg.shopinfo, '')
1216
1217 cmdlib.registerServerCommand('wcs_reload_races', cmdreg.reloadRaces, 'Will reload to races.ini file')
1218
1219 es.load('wcs/tools')
1220 es.load('wcs/addons')
1221
1222 if os.path.isdir(os.path.join(ini.path, 'extension', game)):
1223 es.load('wcs/extension/'+game)
1224 es.ServerVar('wcs_game').set(game)
1225
1226 races = racedb.getAll()
1227 es.ServerVar('wcs_version', version, 'Warcraft: Source version - Made by Tha Pwned original by Kryptonite').makepublic()
1228 es.ServerVar('wcs_author', author, 'The authors of WCS').makepublic()
1229 es.ServerVar('wcs_racecount', len(races), 'The amount of races on the server').makepublic()
1230
1231 global curmap
1232 curmap = es.ServerVar('eventscripts_currentmap')
1233 es.ServerVar('wcs_gamestarted').set(curmap)
1234
1235 global aliass
1236 for race in races:
1237 for section in races[race]:
1238 if 'racealias_' in section:
1239 if section in aliass:
1240 logging.log('wcs: Error: The racealias '+section+' is already in use')
1241 else:
1242 aliass[section] = str(races[race][section])
1243
1244 if section == 'skillcfg':
1245 global raceevents
1246 if not race in raceevents:
1247 raceevents[race] = {}
1248
1249 events = races[race]['skillcfg'].split('|')
1250
1251 for index, cfg in enumerate(events):
1252 if not cfg in raceevents[race]:
1253 raceevents[race][cfg] = []
1254
1255 raceevents[race][cfg].append(str(index))
1256
1257 elif section == 'preloadcmd':
1258 es.server.insertcmd(races[race]['preloadcmd'])
1259
1260 if 'skill' in section:
1261 for y in races[race][section]:
1262 if 'racealias_' in y:
1263 if y in aliass:
1264 logging.log('wcs: Error: The racealias '+y+' is already in use')
1265 else:
1266 aliass[y] = str(races[race][section][y])
1267
1268 items = ini.getItems
1269 for section in items:
1270 for item in items[section]:
1271 for q in items[section][item]:
1272 if 'shopalias_' in q:
1273 if q in aliass:
1274 logging.log('wcs: Error: The shopalias '+q+' is already in use')
1275 else:
1276 aliass[q] = str(items[section][item][q])
1277
1278 if es.getplayercount():
1279 es.server.queuecmd('mp_restartgame 2')
1280
1281 global gamestarted
1282 gamestarted = 0
1283 es.ServerVar('wcs_gamestarted').set(0)
1284
1285 tag = es.ServerVar('sv_tags')
1286 if not 'wcs' in str(tag):
1287 v = str(tag).split(',')
1288 v.append('wcs')
1289 tag.set(','.join(v))
1290
1291info.version = version
1292def unload():
1293 if os.path.isdir(os.path.join(ini.path, 'extension', game)):
1294 es.unload('wcs/extension/'+game)
1295
1296 #for userid in es.getUseridList():
1297 # cmdreg.savexp(userid, '')
1298
1299 for x in es.getUseridList():
1300 savexp.doCommand(x, False)
1301
1302 tmp.clear()
1303 tmp1.clear()
1304 tmp2.clear()
1305
1306 for x in getPopups():
1307 if popuplib.exists(x):
1308 popuplib.close(x, es.getUseridList())
1309 popuplib.delete(x)
1310
1311 database.save()
1312 database.close()
1313
1314 cmdlib.unregisterClientCommand('changerace')
1315 cmdlib.unregisterClientCommand('showxp')
1316 cmdlib.unregisterClientCommand('playerinfo')
1317 cmdlib.unregisterClientCommand('wcsrank')
1318 cmdlib.unregisterClientCommand('wcstop')
1319 cmdlib.unregisterClientCommand('spendskills')
1320 cmdlib.unregisterClientCommand('resetskills')
1321 cmdlib.unregisterClientCommand('wcsmenu')
1322 cmdlib.unregisterClientCommand('wcshelp')
1323 cmdlib.unregisterClientCommand('wcs')
1324 cmdlib.unregisterClientCommand('raceinfo')
1325 cmdlib.unregisterClientCommand('savexp')
1326 cmdlib.unregisterClientCommand('showskills')
1327 cmdlib.unregisterClientCommand('shopmenu')
1328 cmdlib.unregisterClientCommand('shopinfo')
1329 cmdlib.unregisterSayCommand('changerace')
1330 cmdlib.unregisterSayCommand('showxp')
1331 cmdlib.unregisterSayCommand('playerinfo')
1332 cmdlib.unregisterSayCommand('wcsrank')
1333 cmdlib.unregisterSayCommand('wcstop')
1334 cmdlib.unregisterSayCommand('spendskills')
1335 cmdlib.unregisterSayCommand('resetskills')
1336 cmdlib.unregisterSayCommand('wcsmenu')
1337 cmdlib.unregisterSayCommand('wcshelp')
1338 cmdlib.unregisterSayCommand('wcs')
1339 cmdlib.unregisterSayCommand('raceinfo')
1340 cmdlib.unregisterSayCommand('savexp')
1341 cmdlib.unregisterSayCommand('showskills')
1342 cmdlib.unregisterSayCommand('shopmenu')
1343 cmdlib.unregisterSayCommand('shopinfo')
1344
1345 cmdlib.unregisterServerCommand('wcs_reload_races')
1346
1347 es.unload('wcs/tools')
1348 es.unload('wcs/addons')
1349
1350 admin.admins.save()
1351 admin.admins.close()
1352 group.groups.save()
1353 group.groups.close()
1354
1355 tag = es.ServerVar('sv_tags')
1356 if 'wcs' in str(tag):
1357 v = str(tag).split(',')
1358 v.remove('wcs')
1359 tag.set(','.join(v))
1360info.basename = info.name.lower()
1361
1362def es_map_start(ev):
1363 for x in es.getUseridList():
1364 savexp.doCommand(x, False)
1365
1366 database.save()
1367
1368 if ev['mapname']:
1369 global curmap
1370 curmap = ev['mapname']
1371
1372 database.updateRank()
1373
1374 events.load()
1375
1376 admin.admins.close()
1377 admin.admins.load()
1378 group.groups.close()
1379 group.groups.load()
1380
1381def checkEvent(userid, event):
1382 logging.log('wcs: Information: Firing event: '+event, 4)
1383 if es.exists('userid', userid):
1384 if int(playerlib.getPlayer(userid).team) > 1:
1385 player = getPlayer(userid)
1386 race = player.player.currace
1387 race1 = racedb.getRace(race)
1388 logging.log('wcs: Information: Found race '+race, 4)
1389 if event in raceevents[race]:
1390 logging.log('wcs: Information: Found event '+event+' in race '+race, 5)
1391 skills = player.race.skills.split('|')
1392 logging.log('wcs: Information: Checking skills...', 4)
1393 for index in raceevents[race][event]:
1394 logging.log('wcs: Information: Found skill '+str(int(index)+1), 4)
1395 level = int(skills[int(index)])
1396 if level:
1397 logging.log('wcs: Information: True level', 4)
1398 es.ServerVar('wcs_userid').set(userid)
1399 es.ServerVar('wcs_dice').set(random.randint(0, 100))
1400 skill = 'skill'+str(int(index)+1)
1401
1402 try:
1403 if race1[skill]['setting'].split('|')[level-1]:
1404 es.server.insertcmd(race1[skill]['setting'].split('|')[level-1])
1405 except IndexError:
1406 logging.log('wcs: Error: '+skill+' on race '+race+' is not correct!')
1407 continue
1408
1409 if 'cmd' in race1[skill]:
1410 if race1[skill]['cmd']:
1411 es.server.insertcmd(race1[skill]['cmd'])
1412 elif 'block' in race1[skill]:
1413 if race1[skill]['block']:
1414 es.doblock(race1[skill]['block'])
1415 else:
1416 logging.log('wcs: Error: Missing cmd- or block-key on race '+race+' inside skill '+skill)
1417 continue
1418
1419 if race1[skill]['sfx']:
1420 es.server.insertcmd(race1[skill]['sfx'])
1421
1422def checkEvent1(userid, event):
1423 logging.log('wcs: Information: Firing event: '+event, 4)
1424 if es.exists('userid', userid):
1425 if int(playerlib.getPlayer(userid).team) > 1:
1426 player = getPlayer(userid)
1427 race = player.player.currace
1428 race1 = racedb.getRace(race)
1429 logging.log('wcs: Information: Found race '+race, 4)
1430 if event in raceevents[race]:
1431 logging.log('wcs: Information: Found event '+event+' in race '+race, 5)
1432 skills = player.race.skills.split('|')
1433 logging.log('wcs: Information: Checking skills...', 4)
1434 index = raceevents[race][event][0]
1435 logging.log('wcs: Information: Found skill '+str(int(index)+1), 4)
1436 level = int(skills[int(index)])
1437 if level:
1438 if gamestarted:
1439 logging.log('wcs: Information: True level', 4)
1440 es.ServerVar('wcs_userid').set(userid)
1441 es.ServerVar('wcs_dice').set(random.randint(0, 100))
1442 skill = 'skill'+str(int(index)+1)
1443 cooldown = wcsgroup.getUser(userid, event+'_cooldown')
1444 if cooldown is None:
1445 cooldown = 0
1446 cooldown = int(cooldown)
1447 wcsgroup.setUser(userid, event+'_pre_cooldown', cooldown)
1448 timed = int(float(time.time()))
1449 downtime = str(race1[skill]['cooldown']).split('|')
1450 if len(downtime) == int(player.race.racedb['numberoflevels']):
1451 downtime = int(downtime[level-1])
1452 else:
1453 downtime = int(downtime[0])
1454
1455 logging.log('wcs: Information: Checking cooldown...', 4)
1456 if not downtime or (timed - cooldown >= downtime):
1457 logging.log('wcs: Information: True cooldown', 4)
1458 if race1[skill]['setting']:
1459 try:
1460 if race1[skill]['setting'].split('|')[level-1]:
1461 es.server.insertcmd(race1[skill]['setting'].split('|')[level-1])
1462 except IndexError:
1463 logging.log('wcs: Error: '+skill+' on race '+race+' is not correct!')
1464 return
1465
1466 var = 'wcs_'+event.replace('player_', '')[:4]+'notexec'
1467 es.ServerVar(var).set(0)
1468
1469 if 'cmd' in race1[skill]:
1470 if race1[skill]['cmd']:
1471 es.server.insertcmd(race1[skill]['cmd'])
1472 elif 'block' in race1[skill]:
1473 if race1[skill]['block']:
1474 es.doblock(race1[skill]['block'])
1475 else:
1476 logging.log('wcs: Error: Missing cmd- or block-key on race '+race+' inside skill '+skill)
1477 return
1478
1479 if race1[skill]['sfx']:
1480 es.server.insertcmd(race1[skill]['sfx'])
1481
1482 #Doesn't seems to work. It takes 1 tick for the variable to be set.
1483 if int(es.ServerVar(var)):
1484 #Skill was stopped by wcs_<var>notexec (so, don't set the cooldown)
1485 return
1486
1487 wcsgroup.setUser(userid, event+'_cooldown', timed)
1488 #Success
1489 return (1, downtime, timed-cooldown)
1490 #Cooldown
1491 return (0, downtime, timed-cooldown)
1492 #Game has not started
1493 return False
1494 return None
1495
1496def tell(userid, text, tokens={}, extra='', lng=True):
1497 if str(userid).startswith('#'):
1498 userid = playerlib.getPlayerList(userid)
1499
1500 if not userid:
1501 return
1502
1503 if not hasattr(userid, '__iter__'):
1504 if not es.exists('userid', userid):
1505 return
1506
1507 userid = (userid, )
1508
1509 for user in userid:
1510 if es.exists('userid', user) and not es.isbot(user):
1511 if lng:
1512 try:
1513 text = strings(text, tokens, langlib.getLangAbbreviation(es.getclientvar(user, 'cl_language')))
1514 except:
1515 logging.log('wcs: There was a error when trying to find the text "'+str(text)+'"')
1516 sys.excepthook(*sys.exc_info())
1517 return
1518
1519 if not text:
1520 continue
1521
1522 if len(extra):
1523 if '#darkgreen' in text or '#darkgreen' in extra:
1524 es.tell(userid, '#multi', str(text%extra).replace('#darkgreen', '\x05'))
1525 else:
1526 saytextlib.sayText2(userid, es.getindexfromhandle(es.getplayerhandle(userid)), str(text%extra))
1527 else:
1528 if '%s' in text:
1529 text = text.replace('%s', '')
1530
1531 if '#darkgreen' in text:
1532 es.tell(userid, '#multi', text.replace('#darkgreen', '\x05'))
1533 else:
1534 saytextlib.sayText2(userid, es.getindexfromhandle(es.getplayerhandle(user)), text)
1535
1536def getPopups():
1537 modules = [admin, changerace, dataAPI, effect, expand, group, keyAPI, playerinfo, raceinfo, resetskills, savexp, shopinfo, shopmenu, showskills, spendskills, sqliteAPI, wcsgroup, wcshelp, wcsmenu, wcstop, welcome]
1538 popupslist = []
1539 for x in modules:
1540 if hasattr(x, 'getPopups'):
1541 for x in getattr(x, 'getPopups')():
1542 popupslist.append(x)
1543
1544 return popupslist
1545
1546def sendPopup(name, userid, args=''):
1547 if es.exists('userid', userid):
1548 if callable(name):
1549 if args:
1550 name(userid, args)
1551 else:
1552 name(userid)
1553 else:
1554 popuplib.send(userid, name)
1555
1556def cancel(userid, what):
1557 wcsgroup.setUser(userid, what+'_cooldown', wcsgroup.getUser(userid, what+'_pre_cooldown'))