Added functionality to allow zone specific property override config files

This commit is contained in:
Mazo 2020-05-30 21:33:26 +01:00
parent d6397d54a1
commit 69e63827fa
7 changed files with 198 additions and 308 deletions

View file

@ -75,6 +75,9 @@ class InterstellarCluster(zones : List[Zone]) extends Actor {
}
sender ! InterstellarCluster.PlayerList(players)
case InterstellarCluster.GetZoneIds() =>
sender ! InterstellarCluster.ZoneIds(zones.map(_.Number))
case msg @ Zone.Lattice.RequestSpecificSpawnPoint(zone_number, _, _, _) =>
recursiveFindWorldInCluster(zones.iterator, _.Number == zone_number) match {
case Some(zone) =>
@ -219,4 +222,7 @@ object InterstellarCluster {
* @param zone_num the zone number to request building map updates for
*/
final case class ZoneMapUpdate(zone_num : Int)
final case class GetZoneIds()
final case class ZoneIds(zoneIds : List[Int])
}

View file

@ -187,6 +187,7 @@ object ObjectClass {
final val katana = 421
final val lancer = 425
final val lasher = 429
final val lasher_projectile_ap = 431
final val liberator_25mm_cannon = 433
final val liberator_bomb_bay = 435
final val liberator_weapon_system = 440
@ -398,6 +399,26 @@ object ObjectClass {
final val targeting_laser_dispenser = 851
final val teleportpad_terminal = 853
final val objectClassMap = scala.collection.mutable.Map[String, Int]()
def ByName(name : String) : Int = {
// This whole thing is a dirty "temporary" hack so I don't have to make a huge map out of the above object vars by hand
// Forgive me.
if(objectClassMap.size == 0) {
val objectClassMethods = ObjectClass.getClass.getDeclaredMethods
objectClassMethods.foreach(x => {
if(x.getReturnType.getName == "int" && x.getParameterTypes.isEmpty) { // ints only & Ignore functions with parameters
val objectName = x.getName
val value = ObjectClass.getClass.getMethod(objectName).invoke(ObjectClass)
objectClassMap.put(objectName, value.asInstanceOf[Int])
}
})
}
objectClassMap(name.toLowerCase())
}
//TODO refactor the following functions into another object later
/**
* Given an object class, retrieve the `Codec` used to parse and translate the constructor data for that type.

View file

@ -0,0 +1,131 @@
package services.properties
import akka.actor.{Actor, ActorRef, Stash}
import net.psforever.objects.zones.InterstellarCluster
import net.psforever.packet.game.{GamePropertyTarget, PropertyOverrideMessage}
import net.psforever.packet.game.PropertyOverrideMessage.GamePropertyScope
import net.psforever.packet.game.objectcreate.ObjectClass
import services.ServiceManager
import services.ServiceManager.Lookup
import scala.collection.mutable.ListBuffer
class PropertyOverrideManager extends Actor with Stash {
private[this] val log = org.log4s.getLogger("PropertyOverrideManager")
private var overrides : Map[Int, Map[String, List[(String, String)]]] = Map()
private var gamePropertyScopes : List[PropertyOverrideMessage.GamePropertyScope] = List()
private var interstellarCluster : ActorRef = Actor.noSender
private var zoneIds : List[Int] = List()
override def preStart = {
log.info(s"Starting PropertyOverrideManager")
ServiceManager.serviceManager ! Lookup("cluster")
}
override def receive = ServiceLookup
def ServiceLookup : Receive = {
case ServiceManager.LookupResult("cluster", endpoint) =>
interstellarCluster = endpoint
if (interstellarCluster != ActorRef.noSender) {
interstellarCluster ! InterstellarCluster.GetZoneIds()
}
case InterstellarCluster.ZoneIds(zoneIds) =>
this.zoneIds = zoneIds
unstashAll()
LoadOverridesFromFile(zoneId = 0) // Global overrides
for(zoneId <- zoneIds) {
LoadOverridesFromFile(zoneId)
}
ProcessGamePropertyScopes()
context.become(ReceiveCommand)
case _ => stash()
}
def ReceiveCommand: Receive = {
case PropertyOverrideManager.GetOverridesMessage => {
sender ! gamePropertyScopes
}
case _ => ;
}
private def LoadOverridesFromFile(zoneId : Int): Unit = {
val zoneOverrides = LoadFile(s"game_objects${zoneId}.adb.lst")
if(zoneOverrides == null) {
log.info(s"No overrides found for zone ${zoneId} using filename game_objects${zoneId}.adb.lst")
return
}
val grouped = zoneOverrides.groupBy(_._1).view.mapValues(_.map(x => (x._2, x._3)).toList).toMap
log.info(s"Loaded property overrides for zone $zoneId: ${grouped.toString}")
overrides += (zoneId -> grouped)
}
private def ProcessGamePropertyScopes(): Unit = {
val scopesBuffer : ListBuffer[GamePropertyScope] = ListBuffer()
for(over <- overrides) {
val zoneId = over._1
val overrideMap = over._2
val gamePropertyTargets : ListBuffer[PropertyOverrideMessage.GamePropertyTarget] = ListBuffer()
for(propOverride <- overrideMap) {
val objectId = ObjectClass.ByName(propOverride._1)
val props = GamePropertyTarget(objectId,propOverride._2)
gamePropertyTargets += props
}
val scope = GamePropertyScope(zoneId, gamePropertyTargets.toList)
scopesBuffer += scope
}
gamePropertyScopes = scopesBuffer.toList
}
def LoadFile(path : String): ListBuffer[(String, String, String)] = {
val stream = getClass.getClassLoader.getResourceAsStream(path)
if(stream == null) {
return null
}
val content = scala.io.Source.fromInputStream(stream).getLines().filter(x => x.startsWith("add_property"))
var data : ListBuffer[(String, String, String)] = ListBuffer()
for(line <- content) {
val splitLine = line.split(" ")
if(splitLine.length >= 3) {
val objectName = splitLine(1)
val property = splitLine(2)
var propertyValue = ""
for(i <- 3 to splitLine.length - 1) {
propertyValue += splitLine(i) + " "
}
propertyValue = propertyValue.trim
data += ((objectName, property, propertyValue))
}
}
stream.close()
data
}
}
object PropertyOverrideManager {
final case class GetOverridesMessage()
}

View file

@ -0,0 +1,14 @@
add_property super_staminakit allowed false
add_property super_staminakit nodrop false
add_property super_staminakit requirement_award0 false
add_property super_staminakit medkit_reuse_delay 300
## add lash damage to AP lasher orbs
add_property lasher_projectile_ap lasher_projectile_ap false
add_property lasher_projectile_ap lasher_projectile true
add_property lasher lash_delay 0.00
add_property ace allowed false
add_property ace_deployable allowed false
add_property advanced_ace allowed false

View file

@ -0,0 +1,10 @@
## No Air Vehicles
add_property dropship allowed false
add_property galaxy_gunship allowed false
add_property liberator allowed false
add_property lightgunship allowed false
add_property lodestar allowed false
add_property mosquito allowed false
add_property phantasm allowed false
add_property vulture allowed false
add_property wasp allowed false

View file

@ -30,8 +30,8 @@ import services.teamwork.SquadService
import scala.collection.JavaConverters._
import scala.concurrent.Await
import scala.concurrent.duration._
import kamon.Kamon
import services.properties.PropertyOverrideManager
object PsLogin {
private val logger = org.log4s.getLogger
@ -279,6 +279,7 @@ object PsLogin {
serviceManager ! ServiceManager.Register(Props[SquadService], "squad")
serviceManager ! ServiceManager.Register(Props(classOf[InterstellarCluster], continentList), "cluster")
serviceManager ! ServiceManager.Register(Props[AccountPersistenceService], "accountPersistence")
serviceManager ! ServiceManager.Register(Props[PropertyOverrideManager], "propertyOverrideManager")
logger.info("Initializing loginRouter & worldRouter")
/** Create two actors for handling the login and world server endpoints */

View file

@ -13,6 +13,7 @@ import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Success
import scodec.bits.ByteVector
import services.properties.PropertyOverrideManager
//project imports
import csr.{CSRWarp, CSRZone, Traveler}
import MDCContextAware.Implicits._
@ -87,8 +88,9 @@ class WorldSessionActor extends Actor
var chatService : ActorRef = ActorRef.noSender
var galaxyService : ActorRef = ActorRef.noSender
var squadService : ActorRef = ActorRef.noSender
var taskResolver : ActorRef = ActorRef.noSender
var cluster : ActorRef = ActorRef.noSender
var taskResolver : ActorRef = Actor.noSender
var propertyOverrideManager : ActorRef = Actor.noSender
var cluster : ActorRef = Actor.noSender
var continent : Zone = Zone.Nowhere
var account : Account = null
var player : Player = null
@ -259,6 +261,7 @@ class WorldSessionActor extends Actor
serviceManager ! Lookup("cluster")
serviceManager ! Lookup("galaxy")
serviceManager ! Lookup("squad")
serviceManager ! Lookup("propertyOverrideManager")
case _ =>
log.error("Unknown message")
@ -303,6 +306,9 @@ class WorldSessionActor extends Actor
case LookupResult("squad", endpoint) =>
squadService = endpoint
log.info("ID: " + sessionId + " Got squad service " + endpoint)
case LookupResult("propertyOverrideManager", endpoint) =>
propertyOverrideManager = endpoint
log.info("ID: " + sessionId + " Got propertyOverrideManager service " + endpoint)
case ControlPacket(_, ctrl) =>
handleControlPkt(ctrl)
@ -1108,313 +1114,14 @@ class WorldSessionActor extends Actor
StartBundlingPackets()
//PropertyOverrideMessage
/*
List Of all Changes
Super Stamina Kits Enabled
Super Stamina Kit Cooldown 20min -> 5min
AP Lasher Bug Fix for Lash
Lasher Balance Change (Lash start immediately instead of 5meters)
Disable ACE and FDU (bug prevention)
Equip/Holster Time Changes for Quality of Life
Ascension, Extinction, and Nexus Battle Island Event Rulesets, Desolation is just default continent ruleset
*/
sendResponse(
PropertyOverrideMessage(List(
GamePropertyScope(0, List(
//Event Kits - Super Stamina Kit
GamePropertyTarget(ObjectClass.super_staminakit, "requirement_award0" -> "false"),
GamePropertyTarget(ObjectClass.super_staminakit, "allowed" -> "true"),
GamePropertyTarget(ObjectClass.super_staminakit, "nodrop" -> "false"),
import akka.pattern.ask
import akka.util.Timeout
implicit val timeout = Timeout(1 seconds)
val future = ask(propertyOverrideManager, PropertyOverrideManager.GetOverridesMessage).mapTo[List[PropertyOverrideMessage.GamePropertyScope]]
val overrides = Await.result(future, 1 second)
//Super Stamina Kit -- Cooldown Timer (5 minutes)
GamePropertyTarget(ObjectClass.super_staminakit, "medkit_reuse_delay" -> "300"),
sendResponse(PropertyOverrideMessage(overrides))
//Fixes bug preventing AP Lasher from Lashing
GamePropertyTarget(431, "lasher_projectile_ap" -> "false"),
GamePropertyTarget(431, "lasher_projectile" -> "true"),
//Lasher Balance Change (Time until Orb starts Lashing)
GamePropertyTarget(430, "lash_delay" -> "0.00"),
//Disable ACE and FDU (bug prevention)
GamePropertyTarget(ObjectClass.ace, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.ace_deployable, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.advanced_ace, "allowed" -> "false"),
//Equip/Holster Time Changes (Quality of Life)
//Heavy Items -- Equip/Holster Time Changes -- 0.75 seconds
GamePropertyTarget(ObjectClass.r_shotgun, "equiptime" -> "750"),
GamePropertyTarget(ObjectClass.r_shotgun, "holstertime" -> "750"),
GamePropertyTarget(ObjectClass.mini_chaingun, "equiptime" -> "750"),
GamePropertyTarget(ObjectClass.mini_chaingun, "holstertime" -> "750"),
GamePropertyTarget(ObjectClass.lasher, "equiptime" -> "750"),
GamePropertyTarget(ObjectClass.lasher, "holstertime" -> "750"),
GamePropertyTarget(ObjectClass.flamethrower, "equiptime" -> "750"),
GamePropertyTarget(ObjectClass.flamethrower, "holstertime" -> "750"),
GamePropertyTarget(ObjectClass.maelstrom, "equiptime" -> "750"),
GamePropertyTarget(ObjectClass.maelstrom, "holstertime" -> "750"),
GamePropertyTarget(ObjectClass.advanced_ace, "equiptime" -> "750"),
GamePropertyTarget(ObjectClass.advanced_ace, "holstertime" -> "750"),
//Medium Items -- Equip/Holster Time Changes -- 0.6 seconds
GamePropertyTarget(ObjectClass.suppressor, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.suppressor, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.punisher, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.punisher, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.gauss, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.gauss, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.cycler, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.cycler, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.cycler_v2, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.cycler_v2, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.cycler_v3, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.cycler_v3, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.cycler_v4, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.cycler_v4, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.pulsar, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.pulsar, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.radiator, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.radiator, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.nano_dispenser, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.nano_dispenser, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.flechette, "equiptime" -> "600"),
GamePropertyTarget(ObjectClass.flechette, "holstertime" -> "600"),
GamePropertyTarget(ObjectClass.oicw, "equiptime" -> "750"),
GamePropertyTarget(ObjectClass.oicw, "holstertime" -> "750"),
GamePropertyTarget(ObjectClass.pellet_gun, "equiptime" -> "750"),
GamePropertyTarget(ObjectClass.pellet_gun, "holstertime" -> "750"),
//Small Items -- Equip/Holster Time Changes -- 0.5s
GamePropertyTarget(ObjectClass.medicalapplicator, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.medicalapplicator, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.bank, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.bank, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.trek, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.trek, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.spiker, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.spiker, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.isp, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.isp, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.ilc9, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.ilc9, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.six_shooter, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.six_shooter, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.beamer, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.beamer, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.repeater, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.repeater, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.remote_electronics_kit, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.remote_electronics_kit, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.flail_targeting_laser, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.flail_targeting_laser, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.anniversary_gun, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.anniversary_gun, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.anniversary_guna, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.anniversary_guna, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.anniversary_gunb, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.anniversary_gunb, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.ace, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.ace, "holstertime" -> "500"),
GamePropertyTarget(ObjectClass.ace_deployable, "equiptime" -> "500"),
GamePropertyTarget(ObjectClass.ace_deployable, "holstertime" -> "500"),
//Knives -- Equip/Holster Time Changes -- 0.25 seconds
GamePropertyTarget(ObjectClass.katana, "equiptime" -> "250"),
GamePropertyTarget(ObjectClass.katana, "holstertime" -> "250"),
GamePropertyTarget(ObjectClass.forceblade, "equiptime" -> "250"),
GamePropertyTarget(ObjectClass.forceblade, "holstertime" -> "250"),
GamePropertyTarget(ObjectClass.magcutter, "equiptime" -> "250"),
GamePropertyTarget(ObjectClass.magcutter, "holstertime" -> "250"),
GamePropertyTarget(ObjectClass.chainblade, "equiptime" -> "250"),
GamePropertyTarget(ObjectClass.chainblade, "holstertime" -> "250")
)),
GamePropertyScope(29, List(
//Extinction (i1) - ground based bridge brawls! - Battle Island Event
//Free Certification Grants
GamePropertyTarget(ObjectClass.nano_dispenser, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.ams, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.quadstealth, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.quadassault, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.fury, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.two_man_assault_buggy, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.skyguard, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.twomanhoverbuggy, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.threemanheavybuggy, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.twomanheavybuggy, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.lightning, "requirement_certification0" -> "false"),
//No Air Vehicles
GamePropertyTarget(ObjectClass.dropship, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.galaxy_gunship, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.liberator, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.lightgunship, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.lodestar, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.mosquito, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.phantasm, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.vulture, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.wasp, "allowed" -> "false"),
//No Tanks, no BFRs, no Flails, no Deliverer Variants
GamePropertyTarget(ObjectClass.mediumtransport, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.aurora, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.battlewagon, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.flail, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.magrider, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.prowler, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.thunderer, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.vanguard, "allowed" -> "false"),
//A Tank, but commented out for population purposes
// GamePropertyTarget(ObjectClass.lightning, "allowed" -> "false"),
//No BFRs
GamePropertyTarget(ObjectClass.aphelion_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.aphelion_gunner, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.colossus_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.colossus_gunner, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.peregrine_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.peregrine_gunner, "allowed" -> "false")
)),
GamePropertyScope(30, List(
//Ascension (i2) - battle for air supremacy! - Battle Island Event
//No Skyguards, no Deliverer Variants, no AA MAX, no BFRs, no Tanks, no Flails Zone specific change Everyone has access to Empire AV weapons and can pilot air vehicles
//Allow Galaxy Gunship and Lodestar at Vehicle Terminals on Ascension
GamePropertyTarget(952, "forsale_galaxy_gunship" -> "true"),
GamePropertyTarget(43, "forsale_galaxy_gunship" -> "true"),
GamePropertyTarget(952, "forsale_lodestar" -> "true"),
GamePropertyTarget(43, "forsale_lodestar" -> "true"),
//Allow Tech Benefit required Aircraft Vehicles at non Tech Benefited Bases
GamePropertyTarget(ObjectClass.liberator, "purchase_tech_plant" -> "false"),
GamePropertyTarget(ObjectClass.lightgunship, "purchase_tech_plant" -> "false"),
GamePropertyTarget(ObjectClass.vulture, "purchase_tech_plant" -> "false"),
GamePropertyTarget(ObjectClass.wasp, "purchase_tech_plant" -> "false"),
//Cert Grants
GamePropertyTarget(ObjectClass.dropship, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.galaxy_gunship, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.liberator, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.lightgunship, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.lodestar, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.mosquito, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.phantasm, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.vulture, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.wasp, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.striker, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.lancer, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.phoenix, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.hunterseeker, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.nano_dispenser, "requirement_certification0" -> "false"),
//No AA MAXes
GamePropertyTarget(ObjectClass.order_terminal, "forsale_nchev_antiaircraft" -> "false"),
GamePropertyTarget(ObjectClass.order_terminal, "forsale_vshev_antiaircraft" -> "false"),
GamePropertyTarget(ObjectClass.order_terminal, "forsale_trhev_antiaircraft" -> "false"),
//Custom Setup: Only AMS, Router and ANT can be purchased at the Ground Vehicle Terminals. Take to the skies!
GamePropertyTarget(ObjectClass.apc_nc, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.apc_tr, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.apc_vs, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.aurora, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.battlewagon, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.flail, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.fury, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.lightning, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.magrider, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.mediumtransport, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.prowler, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.quadassault, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.quadstealth, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.skyguard, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.switchblade, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.threemanheavybuggy, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.thunderer, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.two_man_assault_buggy, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.twomanheavybuggy, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.twomanhoverbuggy, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.vanguard, "allowed" -> "false"),
//No BFRs
GamePropertyTarget(ObjectClass.aphelion_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.aphelion_gunner, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.colossus_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.colossus_gunner, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.peregrine_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.peregrine_gunner, "allowed" -> "false")
)),
GamePropertyScope(32, List(
//Nexus (i4) - t3h footzerg! - Battle Island Event
//Free Vehicle Certification Grants
GamePropertyTarget(ObjectClass.dropship, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.phantasm, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.router, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.ams, "requirement_certification0" -> "false"),
//Free Weapon Certification Grants
GamePropertyTarget(ObjectClass.anniversary_gun, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.flechette, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.punisher, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.cycler, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.gauss, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.pulsar, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.mini_chaingun, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.r_shotgun, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.lasher, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.striker, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.lancer, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.phoenix, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.hunterseeker, "requirement_certification0" -> "false"),
GamePropertyTarget(ObjectClass.nano_dispenser, "requirement_certification0" -> "false"),
//Only Galaxies and Phantasms can be purchased at the Dropship Terminal
GamePropertyTarget(ObjectClass.galaxy_gunship, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.liberator, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.lightgunship, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.lodestar, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.mosquito, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.vulture, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.wasp, "allowed" -> "false"),
//Only Routers and ANTs can be purchased at the Ground Vehicle Terminal (also allowing the AMS for now)
//GamePropertyTarget(ObjectClass.ams, "allowed" -> "false"), //normally disabled
GamePropertyTarget(ObjectClass.apc_nc, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.apc_tr, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.apc_vs, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.aurora, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.battlewagon, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.flail, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.fury, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.lightning, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.magrider, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.mediumtransport, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.prowler, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.quadassault, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.quadstealth, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.skyguard, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.switchblade, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.threemanheavybuggy, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.thunderer, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.two_man_assault_buggy, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.twomanheavybuggy, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.twomanhoverbuggy, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.vanguard, "allowed" -> "false"),
//No BFRs
GamePropertyTarget(ObjectClass.aphelion_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.aphelion_gunner, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.colossus_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.colossus_gunner, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.peregrine_flight, "allowed" -> "false"),
GamePropertyTarget(ObjectClass.peregrine_gunner, "allowed" -> "false")
))
))
)
sendResponse(PlanetsideAttributeMessage(PlanetSideGUID(0), 112, 0)) // disable festive backpacks
sendResponse(ReplicationStreamMessage(5, Some(6), Vector.empty)) //clear squad list
sendResponse(FriendsResponse(FriendAction.InitializeFriendList, 0, true, true, Nil))