basic interference fields; setting up operations for ce deployables

This commit is contained in:
Fate-JH 2024-03-19 11:47:44 -04:00
parent 426ab84f0a
commit 6813778019
6 changed files with 124 additions and 36 deletions

View file

@ -33,7 +33,7 @@ class DeployableToolbox {
* keys: categories, values: quantity storage object
*/
private val categoryCounts =
DeployableCategory.values.toSeq.map(value => { value -> new DeployableToolbox.Bin }).toMap
DeployableCategory.values.map(value => { value -> new DeployableToolbox.Bin }).toMap
/**
* a map of bins for keeping track of the quantities of individual deployables
@ -46,7 +46,7 @@ class DeployableToolbox {
* keys: categories, values: deployable objects
*/
private val deployableLists =
DeployableCategory.values.toSeq
DeployableCategory.values
.map(value => { value -> mutable.ListBuffer[DeployableToolbox.AcceptableDeployable]() })
.toMap
@ -73,7 +73,7 @@ class DeployableToolbox {
}
}
def UpdateMaxCounts(certifications: Set[Certification]) = {
def UpdateMaxCounts(certifications: Set[Certification]): Unit = {
DeployableToolbox.UpdateMaxCounts(deployableCounts, categoryCounts, certifications)
}
@ -247,7 +247,7 @@ class DeployableToolbox {
* @param category the target category
* @return any deployable that is found
*/
def DisplaceFirst(category: DeployableCategory.Value): Option[DeployableToolbox.AcceptableDeployable] = {
def DisplaceFirst(category: DeployableCategory): Option[DeployableToolbox.AcceptableDeployable] = {
val categoryList = deployableLists(category)
if (categoryList.nonEmpty) {
val found = categoryList.remove(0)
@ -294,7 +294,7 @@ class DeployableToolbox {
* @param filter the type of deployable
* @return a list of globally unique identifiers that should be valid for the current zone
*/
def Category(filter: DeployableCategory.Value): List[PlanetSideGUID] = {
def Category(filter: DeployableCategory): List[PlanetSideGUID] = {
deployableLists(filter).map(_.GUID).toList
}
@ -478,7 +478,7 @@ object DeployableToolbox {
*/
private def UpdateMaxCounts(
counts: Map[DeployedItem.Value, DeployableToolbox.Bin],
categories: Map[DeployableCategory.Value, DeployableToolbox.Bin],
categories: Map[DeployableCategory, DeployableToolbox.Bin],
certifications: Set[Certification]
): Unit = {
import Certification._

View file

@ -77,18 +77,18 @@ object Deployable {
}
object Category {
def Of(item: DeployedItem.Value): DeployableCategory.Value = deployablesToCategories(item)
def Of(item: DeployedItem.Value): DeployableCategory = deployablesToCategories(item)
def Includes(category: DeployableCategory.Value): List[DeployedItem.Value] = {
def Includes(category: DeployableCategory): List[DeployedItem.Value] = {
(for {
(ce: DeployedItem.Value, cat: DeployableCategory.Value) <- deployablesToCategories
(ce: DeployedItem.Value, cat: DeployableCategory) <- deployablesToCategories
if cat == category
} yield ce) toList
}
def OfAll(): Map[DeployedItem.Value, DeployableCategory.Value] = deployablesToCategories
def OfAll(): Map[DeployedItem.Value, DeployableCategory] = deployablesToCategories
private val deployablesToCategories: Map[DeployedItem.Value, DeployableCategory.Value] = Map(
private val deployablesToCategories: Map[DeployedItem.Value, DeployableCategory] = Map(
DeployedItem.boomer -> DeployableCategory.Boomers,
DeployedItem.he_mine -> DeployableCategory.Mines,
DeployedItem.jammer_mine -> DeployableCategory.Mines,

View file

@ -1,8 +1,26 @@
// Copyright (c) 2017 PSForever
package net.psforever.objects.ce
object DeployableCategory extends Enumeration {
type Type = Value
abstract class DeployableCategory(val name: String)
val Boomers, Mines, SmallTurrets, Sensors, TankTraps, FieldTurrets, ShieldGenerators, Telepads = Value
object DeployableCategory {
case object None extends DeployableCategory(name = "None")
case object Boomers extends DeployableCategory(name = "Boomers")
case object Mines extends DeployableCategory(name = "Mines")
case object SmallTurrets extends DeployableCategory(name = "SmallTurrets")
case object Sensors extends DeployableCategory(name = "Sensors")
case object TankTraps extends DeployableCategory(name = "TankTraps")
case object FieldTurrets extends DeployableCategory(name = "FieldTurrets")
case object ShieldGenerators extends DeployableCategory(name = "ShieldGenerators")
case object Telepads extends DeployableCategory(name = "Telepads")
val values: Seq[DeployableCategory] = Seq(None, Boomers, Mines, SmallTurrets, Sensors, TankTraps, FieldTurrets, ShieldGenerators, Telepads)
}

View file

@ -19,15 +19,15 @@ object DeployAnimation extends Enumeration {
}
trait BaseDeployableDefinition {
private var category: DeployableCategory.Value = DeployableCategory.Boomers
private var category: DeployableCategory = DeployableCategory.None
private var deployTime: Long = (1 second).toMillis //ms
var deployAnimation: DeployAnimation.Value = DeployAnimation.None
def Item: DeployedItem.Value
def DeployCategory: DeployableCategory.Value = category
def DeployCategory: DeployableCategory = category
def DeployCategory_=(cat: DeployableCategory.Value): DeployableCategory.Value = {
def DeployCategory_=(cat: DeployableCategory): DeployableCategory = {
category = cat
DeployCategory
}

View file

@ -7,6 +7,59 @@ import net.psforever.objects.geometry.GeometryForm
import net.psforever.objects.geometry.d3.VolumetricGeometry
import net.psforever.types.OxygenState
/*
Line 1316: add_property ams interference_range 125
Line 1392: add_property ams shared_interference_range 30
Line 5977: add_property boomer interference_range 0.2
Line 8735: add_property deployable_shield_generator deployable_interference_range 2.0
Line 8775: add_property deployable_shield_generator interference_range 125
Line 8798: add_property deployable_shield_generator shared_interference_range 60
Line 13684: add_property he_mine deployable_interference_range 0.1
Line 13695: add_property he_mine interference_range 7
Line 13709: add_property he_mine shared_interference_range 7
Line 14634: add_property jammer_mine deployable_interference_range 0.1
Line 14645: add_property jammer_mine interference_range 7
Line 14661: add_property jammer_mine shared_interference_range 7
Line 21038: add_property motion_alarm_sensor_dest interference_range 15
Line 21057: add_property motionalarmsensor deployable_interference_range 0.1
Line 21072: add_property motionalarmsensor interference_range 25
Line 24898: add_property portable_manned_turret deployable_interference_range 2.5
Line 24915: add_property portable_manned_turret interference_range 60
Line 24981: add_property portable_manned_turret shared_interference_range 40
Line 28196: add_property sensor_shield deployable_interference_range 0.1
Line 28205: add_property sensor_shield interference_range 20
Line 29572: add_property spitfire_aa deployable_interference_range 0.1
Line 29584: add_property spitfire_aa interference_range 25
Line 29608: add_property spitfire_aa shared_interference_range 25
Line 29819: add_property spitfire_cloaked deployable_interference_range 0.1
Line 29831: add_property spitfire_cloaked interference_range 25
Line 29855: add_property spitfire_cloaked shared_interference_range 25
Line 29939: add_property spitfire_turret deployable_interference_range 0.1
Line 29951: add_property spitfire_turret interference_range 25
Line 29975: add_property spitfire_turret shared_interference_range 25
Line 30231: add_property stationaryteleportpad deployable_interference_range 5.5
Line 30933: add_property tank_traps deployable_interference_range 3.0
Line 30943: add_property tank_traps interference_range 3.5
Line 30944: add_property tank_traps interference_range2 60
Line 30969: add_property tank_traps shared_interference_range 60
Line 37319: add_property zipline deployable_interference_range 5.5
*/
/**
* Block the deployment of certain entities within a certain distance.
* Deployable vehicles and combat engineer entities both have a deployment condition that can be influenced by these ranges.
* Vehicles of an object type block other vehicles of that object type.
* Combat engineering entities block combat engineering entities of the same category.
* @param main distance between which similar deployable entities block one another (m)
* @param shared na
* @param deployable distance between which this entity may block deployment of other combat engineering entities (m);
* defaults to 0
*/
final case class InterferenceRange(main: Float, shared: Float, deployable: Float = 0f)
object InterferenceRange {
val None: InterferenceRange = InterferenceRange(0f, 0f)
}
/**
* Associate an object's canned in-game representation with its basic game identification unit.
* The extension of this `class` would identify the common data necessary to construct such a given game object.<br>
@ -121,5 +174,10 @@ abstract class ObjectDefinition(private val objectId: Int)
*/
var maxForwardSpeed: Float = 0f
/**
* na
*/
var interference: InterferenceRange = InterferenceRange.None
def ObjectId: Int = objectId
}

View file

@ -8,6 +8,7 @@ import net.psforever.objects.ce.Deployable
import net.psforever.objects.sourcing.ObjectSource
import net.psforever.objects.vehicles.MountedWeapons
import net.psforever.objects.vital.SpawningActivity
import net.psforever.types.Vector3
import scala.annotation.tailrec
import scala.collection.mutable
@ -28,7 +29,7 @@ class ZoneDeployableActor(
def receive: Receive = {
case Zone.Deployable.Build(obj) =>
if (DeployableBuild(obj, deployableList)) {
if (DeployableBuild(zone, obj, deployableList)) {
obj.Zone = zone
obj match {
case mounting: MountedWeapons =>
@ -40,11 +41,10 @@ class ZoneDeployableActor(
.foreach { guid =>
turretToMount.put(guid, dguid)
}
case _ => ;
case _ => ()
}
obj.Definition.Initialize(obj, context)
zone.actor ! ZoneActor.AddToBlockMap(obj, obj.Position)
//obj.History(EntitySpawn(SourceEntry(obj), obj.Zone))
obj.LogActivity(SpawningActivity(ObjectSource(obj), zone.Number, None))
obj.Actor ! Zone.Deployable.Setup()
} else {
log.warn(s"failed to build a ${obj.Definition.Name}")
@ -52,7 +52,7 @@ class ZoneDeployableActor(
}
case Zone.Deployable.BuildByOwner(obj, owner, tool) =>
if (DeployableBuild(obj, deployableList)) {
if (DeployableBuild(zone, obj, deployableList)) {
obj.Zone = zone
obj match {
case mounting: MountedWeapons =>
@ -64,10 +64,9 @@ class ZoneDeployableActor(
.foreach { guid =>
turretToMount.put(guid, dguid)
}
case _ => ;
case _ => ()
}
obj.Definition.Initialize(obj, context)
zone.actor ! ZoneActor.AddToBlockMap(obj, obj.Position)
obj.LogActivity(SpawningActivity(ObjectSource(obj), zone.Number, None))
owner.Actor ! Player.BuildDeployable(obj, tool)
} else {
@ -76,17 +75,16 @@ class ZoneDeployableActor(
}
case Zone.Deployable.Dismiss(obj) =>
if (DeployableDismiss(obj, deployableList)) {
if (DeployableDismiss(zone, obj, deployableList)) {
obj match {
case _: MountedWeapons =>
val dguid = obj.GUID.guid
turretToMount.filterInPlace { case (_, guid) => guid != dguid }
case _ => ;
case _ => ()
}
obj.Actor ! Zone.Deployable.IsDismissed(obj)
obj.Definition.Uninitialize(obj, context)
obj.ClearHistory()
zone.actor ! ZoneActor.RemoveFromBlockMap(obj)
}
case Zone.Deployable.IsBuilt(_) => ;
@ -99,27 +97,41 @@ class ZoneDeployableActor(
object ZoneDeployableActor {
def DeployableBuild(
obj: Deployable,
deployableList: ListBuffer[Deployable]
): Boolean = {
zone: Zone,
obj: Deployable,
deployableList: ListBuffer[Deployable]
): Boolean = {
val position = obj.Position
val positionxy = position.xy
deployableList.find(d => d == obj) match {
case Some(_) =>
false
case None =>
case None if {
val interference = obj.Definition.interference
val category = obj.Definition.DeployCategory
val sector = zone.blockMap.sector(position, interference.main)
!sector.deployableList.exists { p =>
p.Definition.DeployCategory == category ||
Vector3.DistanceSquared(positionxy, p.Position.xy).toDouble < math.pow(p.Definition.interference.deployable.toDouble, 2)
}
} =>
deployableList += obj
zone.actor ! ZoneActor.AddToBlockMap(obj, position)
true
case _ =>
false
}
}
def DeployableDismiss(
obj: Deployable,
deployableList: ListBuffer[Deployable]
): Boolean = {
zone: Zone,
obj: Deployable,
deployableList: ListBuffer[Deployable]
): Boolean = {
recursiveFindDeployable(deployableList.iterator, obj) match {
case None =>
false
case Some(index) =>
deployableList.remove(index)
zone.actor ! ZoneActor.RemoveFromBlockMap(obj)
true
}
}