Page 1 of 1

[GAME MODE] Territory Towers!

Posted: Wed Jun 19, 2013 5:33 pm
by thepolm3
By popular demand, or rather by Jdrew's demand, here it is!
tctower is like itower, except instead of full on destroying the tower, you destroy it in order to convert it to your colour. It is designed to work with any other tc script as a sidescript, be it moba, tow or an as yet unmade script!
Here is the code
Code: Select all
"""
thepolm3
converts the cps to towers to be defended and captured
Suggested by Jdrew
"""
from twisted.internet.task import LoopingCall
from twisted.internet.reactor import callLater
from pyspades.constants import *
from pyspades.server import block_action, set_color, block_line
from commands import get_team
from pyspades.common import make_color

def apply_script(protocol, connection, config):
    class TerritoryControlTowerConnection(connection):
        
        def on_block_destroy(self, x, y, z, mode):
            tower=self.protocol.is_tower(x,y,z)
            if tower:
                if tower.team==self.team:
                    return False
                if self.tool!=SPADE_TOOL:
                    return False
                tower.add_player(self)
                callLater(0.1,self.capture_if_allowed,tower, x,y,z)
            return connection.on_block_destroy(self, x, y, z, mode)

        def capture_if_allowed(self, tower, x,y,z):
            if self in tower.players:
                callLater(0.1,self.protocol.convert_tower,tower,self)
            else:
                self.protocol.repair_tower(tower.id)

    class TerritoryControlTowerProtocol(protocol):
        game_mode=TC_MODE
        towers=[]
        capstop=None

        def destroyBlock(self, x,y,z):
            if 1<x<511 and 1<y<511 and 1<z<63:
                block_action.value = DESTROY_BLOCK
                block_action.x,block_action.y,block_action.z=x,y,z
                self.map.remove_point(x,y,z)
                self.send_contained(block_action)
        
        def buildBlock(self, x,y,z,colour):
            if 1<x<511 and 1<y<511 and 1<z<63:
                block_action.value = BUILD_BLOCK
                block_action.x,block_action.y,block_action.z=x,y,z
                set_color.value = make_color(*colour)
                self.map.set_point(x,y,z,colour)
                self.send_contained(block_action)
                self.send_contained(set_color)

        def is_tower(self,x,y,z):
            for i in range(len(self.towers)):
                xa,ya,za=self.towers[i]
                if xa+1>=x>=xa-2 and ya+1>=y>=ya-2:
                    return self.entities[i]
            return False

        def convert_tower(self,tower,player):
            i=tower.id
            x,y,z=self.towers[i]
            if not self.map.get_solid(x,y,z):
                tower.rate=[0,1][tower.team==self.blue_team]
                tower.finish()
                self.repair_tower(i)
                protocol.on_cp_capture(self,tower)

        def remove_tower(self,ID):
            xa,ya,zb=self.towers[ID]
            height=zb+9
            zb=height
            for x in range(-1,2):
                for y in range(-1,2):
                    for z in range(0,height):
                        self.destroyBlock(x+xa,y+ya,z)
            self.buildBlock(xa,ya,62,(155,155,155))

        def repair_tower(self,ID):
            xa,ya,height=self.towers[ID]
            if self.entities[ID].team:
                colour=self.entities[ID].team.color
            else:
                colour=(255,255,255)
            for x in range(-2,1):
                for y in range(-2,1):
                    for z in range(height-1,62):
                        if self.map.get_solid(x+xa,y+ya,z):
                            if self.map.get_point(x+xa,y+ya,z)[1]!=colour:
                                self.destroyBlock(x+xa,y+ya,z)
                                self.buildBlock(x+xa,y+ya,z,colour)
                        else:
                            self.buildBlock(x+xa,y+ya,z,colour)
            for x in range(-2,1):
                for y in range(-2,1):
                    self.destroyBlock(x+xa,y+ya,height)
                    self.buildBlock(x+xa,y+ya,height,(0,0,0))
            self.destroyBlock(xa,ya,62)

        def create_tower(self,ID):
            xa,ya=self.entities[ID].x,self.entities[ID].y
            height=self.map.get_z(xa,ya)-10
            if self.entities[ID].team:
                colour=self.entities[ID].team.color
            else:
                colour=(255,255,255)
            for x in range(-1,2):
                for y in range(-1,2):
                    for z in range(height,64):
                        self.destroyBlock(x+xa,y+ya,z)
                        self.buildBlock(x+xa,y+ya,z,colour)
            for x in range(-1,2):
                for y in range(-1,2):
                    self.destroyBlock(x+xa,y+ya,height+1)
                    self.buildBlock(x+xa,y+ya,height+1,(0,0,0))
            if len(self.towers)>ID:
                self.towers[ID]=(x+xa,y+ya,height+1)
            else:
                self.towers.append((x+xa,y+ya,height+1))
            self.destroyBlock(xa,ya,62) #puts the cp below the tower

        def reset_tc(self):
            for i in range(len(self.entities)):
                self.remove_tower(i)
            return protocol.reset_tc(self)
                
        def get_cp_entities(self):
            self.entities=protocol.get_cp_entities(self)
            for i in range(len(self.entities)):
                self.create_tower(i)
                self.entities[i].z=63
                self.capstop=LoopingCall(self.stop_capture)
                self.capstop.start(0.1)
            return self.entities

        def stop_capture(self):
            #hate this workaround, buut otherwise this wouldn't be compatible with other scripts
            for cp in self.entities:
                
                cp.progress = 0.0
                cp.update()

    return TerritoryControlTowerProtocol, TerritoryControlTowerConnection


Re: [GAME MODE] Territory Towers!

Posted: Thu Jun 20, 2013 6:50 pm
by IceCream
Nice script :)