[GAME MODE] Territory Towers!

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


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

Attachments
tctower.py
(5.48 KiB) Downloaded 162 times
Last edited by thepolm3 on Fri Jun 21, 2013 11:18 am, edited 2 times in total.
IceCream
Hoster
Hoster
Posts: 322
Joined: Thu Nov 01, 2012 12:18 pm


Nice script :)
2 posts Page 1 of 1 First unread post
Return to “Completed Releases”

Who is online

Users browsing this forum: No registered users and 23 guests