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