Code: Show/Hide Example: 25,25,200,200 (square box) |
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 |
Code: Show/Hide // in mm func mm->RegCallback(CB_REGION, region_cb, ALLARENAS); ... mm->UnregCallback(CB_REGION, region_cb, ALLARENAS); ... // in local void region_cb(Player *p, Region *rgn, int x, int y, int entering) if (entering && strcmp(mapdata->RegionName(rgn), "warpregion") == 0) { Target t; t.u.type = T_PLAYER; t.u.p = p; game->prize(&t, PRIZE_WARP, 1); } |
Code: Show/Hide #include "asss.h"
local void MyRegionFunc(Player *p, Region *rgn, int x, int y, int entering); local Imodman *mm; local Ichat *chat; local Imapdata *mapdata; local void MyRegionFunc(Player *p, Region *rgn, int x, int y, int entering) { const char *rname = mapdata->RegionName(rgn); if (entering) { chat->SendMessage(p, "entering region %s", rname); } else { chat->SendMessage(p, "leaving region %s", rname); } } EXPORT int MM_regiontriggers(int action, Imodman *mm_, Arena *arena) { if (action == MM_LOAD) { mm = mm_; chat = mm->GetInterface(I_CHAT, ALLARENAS); mapdata = mm->GetInterface(I_MAPDATA, ALLARENAS); if (!chat || !mapdata) return MM_FAIL; return MM_OK; } else if (action == MM_UNLOAD) { mm->ReleaseInterface(chat); mm->ReleaseInterface(mapdata); return MM_OK; } else if (action == MM_ATTACH) { mm->RegCallback(CB_REGION, MyRegionFunc, arena); return MM_OK; } else if (action == MM_DETACH) { mm->UnregCallback(CB_REGION, MyRegionFunc, arena); return MM_OK; } return MM_FAIL; } |
Code: Show/Hide mm->RegCallback(CB_REGION, MyRegionFunc, arena); |
Code: Show/Hide const char *rname = mapdata->RegionName(rgn); |
Code: Show/Hide SELECT Owner FROM SomeTable WHERE RegionName = 'some name' |
Smong wrote: | |
In your second problem with mysql I'm not entirely sure what you want to do. Assuming each region is a planet and you want to send an enter message saying who owns the planet you could do something like this:
|
Code: Show/Hide region_name | object id | planet_name | owner
------------+-----------+-------------+------ planet1 | 9600 | <unclaimed> | <none> planet2 | 9601 | Pluto | Mickey ... SELECT planet_name, owner FROM SomeTable WHERE region_name = 'some name' /* insert asss mysql code here * ... */ chat->SendMessage(p, "You have landed on the planet %s owned by %s", planetname, owner) |