Page 1 of 1

[GAME MODE] babel

Posted: Thu Jun 27, 2013 3:59 pm
by thepolm3
Obviously, this is not my mode. But I don't particularly like the way babel works, or how long the script is, or the way it handles team block destruction. So I made my own.
If you want any custom features in babel just ask :D
The main advantage is that you don't need two scripts to do one gamemode
Code: Select all
# Tower of Babel game mode by Yourself
# Anti-griefized by izzy
# Made better by thepolm3
# like, alot better
from pyspades.constants import *
from random import randint
from twisted.internet.reactor import callLater

TRANSPARENT,FOG_COLOR,MULTI_TEAM=range(3)

PLATFORM_WIDTH = 50
PLATFORM_LENGTH = 100
PLATFORM_HEIGHT = 10 #below max spawn height
PLATFORM_COLOR = TRANSPARENT
BLUE_BASE_COORDS = (256-138, 256)
GREEN_BASE_COORDS = (256+138, 256)
SPAWN_SIZE = 40

PLATFORM_WIDTH /= 2
PLATFORM_LENGTH /= 2
PLATFORM_HEIGHT /= 2

def below_platform(x, y, z):
    h,w,l=PLATFORM_HEIGHT,PLATFORM_WIDTH,PLATFORM_LENGTH
    return (z >= h and 256+w>=y>=256-w and 256+l>=x>=256-l)

def above_platform(x, y, z):
    h,w,l=PLATFORM_HEIGHT,PLATFORM_WIDTH,PLATFORM_LENGTH
    return (z <= h and 256+w>=y>=256-w and 256+l>=x>=256-l)

def touching_platform(x,y,z):
    h,w,l=PLATFORM_HEIGHT,PLATFORM_WIDTH,PLATFORM_LENGTH
    return (h+1>=z>=h-1 and 256+w+1>=y>=256-w-1 and 256+l+1>=x>=256-l-1)

def apply_script(protocol, connection, config):
    
    class TowerOfBabelConnection(connection):
        block_list = []

        def on_spawn_location(self,pos):
            x,y,z = self.team.base.x,self.team.base.y,63
            while z==63 and not above_platform(x,y,z):
                x += randint(-SPAWN_SIZE, SPAWN_SIZE)
                y += randint(-SPAWN_SIZE, SPAWN_SIZE)
                z = self.protocol.map.get_z(x, y)
            return (x+0.5, y+0.5, z-0.5)

        def on_block_destroy(self, x, y, z, value):
            if not self.is_valid_destroy(x,y,z): return False
            if value==GRENADE_DESTROY:
                for xa in range(-1,2):
                    for ya in range(-1,2):
                        for za in range(-1,2):
                            if not self.is_valid_destroy(x+xa,y+ya,z+za): return False
            return connection.on_block_destroy(self, x, y, z, value)

        def is_valid_destroy(self,x,y,z):
            if touching_platform(x, y, z): return False
            try:
                for player in self.protocol.players.values():
                    if player.block_list!=self.block_list:
                        if player.team==self.team and (x, y, z) in player.block_list:
                            self.send_chat("You can't destroy your team's blocks")
                            return False
            except Exception:
                pass
            return True

        def on_block_build_attempt(self, x, y, z):
            if touching_platform(x, y, z): return False
            if 5>x-self.team.base.x>-5 and 5>y-self.team.base.y>-5:
                self.send_chat("You can't build so close to your base")
                return False
            self.block_list.append((x,y,z))
            return connection.on_block_build_attempt(self, x, y, z)

        def on_line_build_attempt(self, points):
            for point in points:
                if self.on_block_build_attempt(*point)==False: return False
            return connection.on_line_build_attempt(self, points)

        def on_flag_take(self):
            # flash team color in sky
            callLater(0.25, self.protocol.set_fog_color,self.protocol.fog_color)
            self.protocol.set_fog_color(self.team.color)
            return connection.on_flag_take(self)

        def on_disconnect(self):
            self.block_list=[] #he won't care after he's gone ;)
            connection.on_disconnect(self)

        # return intel to platform if dropped
        def on_flag_drop(self):
            if not above_platform(*self.get_location()):
                self.protocol.reset_flags()
                self.protocol.send_chat('The intel has returned to the heavens')
            return connection.on_flag_drop(self)

    class TowerOfBabelProtocol(protocol):
        game_mode = CTF_MODE

        def reset_flags(self):
            for flag in self.blue_team.flag,self.green_team.flag:
                flag.x,flag.y,flag.z=self.on_flag_spawn(0,0,0,flag,flag.id)
                flag.update()

        def build_platform(self):
            map=self.map
            for y in xrange(256 - PLATFORM_WIDTH, 256 + PLATFORM_WIDTH):
                for x in xrange(256 - PLATFORM_LENGTH, 256 + PLATFORM_LENGTH):
                    if PLATFORM_COLOR==TRANSPARENT: map.set_point(x, y, PLATFORM_HEIGHT, map.get_color(x,y,map.get_z(x,y)))
                    elif PLATFORM_COLOR==FOG_COLOR: map.set_point(x, y, PLATFORM_HEIGHT, getattr(self.map_info.info, 'fog', (128, 232, 255)))
                    elif PLATFORM_COLOR==MULTI_TEAM:
                        if x<256: map.set_point(x, y, PLATFORM_HEIGHT, self.blue_team.color)
                        elif x>256: map.set_point(x, y, PLATFORM_HEIGHT, self.green_team.color)
                        else: map.set_point(x, y, PLATFORM_HEIGHT, (0,0,0))
                    else: map.set_point(x, y, PLATFORM_HEIGHT, PLATFORM_COLOR)

        def on_flag_spawn(self,x,y,z,flag,id):
            x = randint(256 - PLATFORM_LENGTH, 256 + PLATFORM_LENGTH)
            y = randint(256 - PLATFORM_WIDTH, 256 + PLATFORM_WIDTH)
            z = PLATFORM_HEIGHT
            return (x,y,z)

        def on_base_spawn(self,x,y,z,base,id):
            if base.team==self.blue_team: x,y = BLUE_BASE_COORDS
            if base.team==self.green_team: x,y = GREEN_BASE_COORDS
            return x,y,self.map.get_z(x,y)

        def on_map_change(self, map):
            self.build_platform()
            return protocol.on_map_change(self, map)

    return TowerOfBabelProtocol, TowerOfBabelConnection
yes yes defero, I'm getting to it

Re: [GAME MODE] babel

Posted: Thu Jun 27, 2013 5:02 pm
by Jdrew
wow thats pretty short for a whole gamemode Blue_Surprised2

Re: [GAME MODE] babel

Posted: Thu Jun 27, 2013 10:05 pm
by TB_
Why did you need two gamemodes earlier?

Re: [GAME MODE] babel

Posted: Thu Jun 27, 2013 10:24 pm
by Danke
Some problems:
You can grief your own blocks, which could be used to grief
You can block in your own tent and your teammates can't stop you
You can grief teammate blocks by having a grenade explode inside your own block (destroy checks one block and then calls remove for the 3x3x3, don't ask me why)
You can break blocks past fog distance (this is already possible in AoS, but obviously bad in babel)

Re: [GAME MODE] babel

Posted: Fri Jun 28, 2013 7:56 pm
by thepolm3
That should cure what ails ya. Also thanks for posting on my script first on bns, you're kind of a hero <3

Re: [GAME MODE] babel

Posted: Sun Sep 22, 2013 1:59 pm
by Lostmotel
The team block protection doesnt seem to be working for me. I don't get any errors, it just doesnt work. The base build protection and the platform protection are working fine. Any suggestions what might be wrong?

Edit: Not that much of an issue, but I also found out that the script is incompatible with the userblocks only script.