[GAME MODE] babel

Intended for use on live public servers.
6 posts Page 1 of 1 First unread post
thepolm3
Scripter
Scripter
Posts: 424
Joined: Sat Feb 16, 2013 10:49 pm


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
Attachments
babel.py
(5.54 KiB) Downloaded 291 times
Last edited by thepolm3 on Mon Jul 22, 2013 9:54 pm, edited 2 times in total.
Jdrew
Mapper
Mapper
Posts: 4808
Joined: Tue Oct 30, 2012 10:48 pm


wow thats pretty short for a whole gamemode Blue_Surprised2
TB_
Post Demon
Post Demon
Posts: 998
Joined: Tue Nov 20, 2012 6:59 pm


Why did you need two gamemodes earlier?
Danke
Scripter
Scripter
Posts: 12
Joined: Wed Jan 16, 2013 11:17 pm


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)
thepolm3
Scripter
Scripter
Posts: 424
Joined: Sat Feb 16, 2013 10:49 pm


That should cure what ails ya. Also thanks for posting on my script first on bns, you're kind of a hero <3
Lostmotel
League Participant
League Participant
Posts: 298
Joined: Sun Nov 18, 2012 1:09 pm


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.
6 posts Page 1 of 1 First unread post
Return to “Completed Releases”

Who is online

Users browsing this forum: No registered users and 2 guests