Code: Show/Hide # wpn by Chambahs and Smong # shark is grunt ship # apr 11 2005 Chambahs # apr 13 2005 Smong # apr 15 2005 smong (bot kill bug fixed) # jun 19 2005 smong (bigref fix) from asss import * chat = get_interface(I_CHAT) game = get_interface(I_GAME) mapdata = get_interface(I_MAPDATA) wpn_bigref = [ None ] wpn_bigref_count = [ 0 ] # a list of regions and ships that they are regions = [ ("minigun", SHIP_WARBIRD), \ ("flak", SHIP_JAVELIN), \ ("bio", SHIP_WEASEL), \ ("rocket", SHIP_LEVIATHAN), \ ("sniper", SHIP_TERRIER), \ ("shock", SHIP_SPIDER), \ ("tank", SHIP_LANCASTER) ] # the default ship defaultship = SHIP_SHARK def make_region_timer(initial, interval): def region_timer(): changeset = [] # for each player def for_each(p): # don't bother on non-wpn arenas try: if not p.arena.wpn_cb1: return except: pass # sanity checks if p.arena and p.status == S_PLAYING and \ is_human(p) and p.ship < SHIP_SPEC: # check regions x = p.position[0] / 16 y = p.position[1] / 16 for rname, ship in regions: if p.ship != ship: rgn = mapdata.FindRegionByName(p.arena, rname) if rgn != None and mapdata.Contains(rgn, x, y): change = ( p, ship, x, y ) changeset.append(change) break for_each_player(for_each) # change their ship outside for each player loop for p, ship, x, y in changeset: game.SetShip(p, ship) game.WarpTo(p, x, y) return 1 return set_timer(region_timer, initial, interval) def kill(arena, killer, killed, bty, flags, pts, green): if not is_human(killed) or killed.ship >= SHIP_SPEC: pass elif killed.ship != SHIP_SHARK: game.SetShip(killed, SHIP_SHARK) return pts, green # freqman interface (broken?) def InitialFreq(p, ship, freq): ship, freq = p.arena.wpn_oldfm.InitialFreq(p, ship, freq) if ship != SHIP_SPEC: ship = defaultship return ship, freq def ShipChange(p, ship, freq): if ship != SHIP_SPEC: ship = defaultship return ship, freq def FreqChange(p, ship, freq): if ship != SHIP_SPEC: ship = defaultship return ship, freq myfm = (InitialFreq, ShipChange, FreqChange) def mm_attach(arena): arena.wpn_cb1 = reg_callback(CB_KILL, kill, arena) #arena.wpn_oldfm = get_interface(I_FREQMAN, arena) #arena.wpn_myfm = reg_interface(I_FREQMAN, myfm, arena) # make one timer only if wpn_bigref[0] == None: wpn_bigref[0] = make_region_timer(500, 100) wpn_bigref_count[0] += 1 def mm_detach(arena): for attr in ['cb1', 'oldfm', 'myfm']: try: delattr(arena, 'wpn_' + attr) except: pass wpn_bigref_count[0] -= 1 if wpn_bigref_count[0] <= 0: wpn_bigref[0] = None |