introduced a 'more elegant' method of adding objects to the Zones via ServerObjectBuilder; pushed information about specifics of Zone into ZoneMap object; shuffled around initialization responsibility to make this agreeable

This commit is contained in:
FateJH 2017-09-22 21:34:08 -04:00
parent 2076100b50
commit 186c4ccba9
9 changed files with 84 additions and 106 deletions

View file

@ -6,6 +6,7 @@ import net.psforever.objects.definition.converter.{CommandDetonaterConverter, Lo
import net.psforever.objects.equipment.CItem.DeployedItem import net.psforever.objects.equipment.CItem.DeployedItem
import net.psforever.objects.equipment._ import net.psforever.objects.equipment._
import net.psforever.objects.inventory.InventoryTile import net.psforever.objects.inventory.InventoryTile
import net.psforever.objects.terminals.OrderTerminalDefinition
import net.psforever.packet.game.objectcreate.ObjectClass import net.psforever.packet.game.objectcreate.ObjectClass
import net.psforever.types.PlanetSideEmpire import net.psforever.types.PlanetSideEmpire
@ -1169,4 +1170,7 @@ object GlobalDefinitions {
fury.Weapons += 1 -> fury_weapon_systema fury.Weapons += 1 -> fury_weapon_systema
fury.TrunkSize = InventoryTile(11, 11) fury.TrunkSize = InventoryTile(11, 11)
fury.TrunkOffset = 30 fury.TrunkOffset = 30
val
orderTerminal = new OrderTerminalDefinition
} }

View file

@ -25,7 +25,7 @@ class IntergalacticCluster(zones : List[Zone]) extends Actor {
case Some(continent) => case Some(continent) =>
sender ! IntergalacticCluster.GiveWorld(zoneId, continent) sender ! IntergalacticCluster.GiveWorld(zoneId, continent)
case None => case None =>
sender ! IntergalacticCluster.GiveWorld(zoneId, Zone.Nowhere) log.error(s"Requested zone with id $zoneId could not be found")
} }
case IntergalacticCluster.RequestZoneInitialization(tplayer) => case IntergalacticCluster.RequestZoneInitialization(tplayer) =>

View file

@ -0,0 +1,10 @@
// Copyright (c) 2017 PSForever
package net.psforever.objects.continent
import akka.actor.ActorContext
import net.psforever.objects.PlanetSideGameObject
import net.psforever.objects.guid.NumberPoolHub
trait ServerObjectBuilder {
def Build(implicit context : ActorContext, guid : NumberPoolHub) : PlanetSideGameObject
}

View file

@ -0,0 +1,22 @@
// Copyright (c) 2017 PSForever
package net.psforever.objects.continent
import net.psforever.objects.terminals.{Terminal, TerminalDefinition}
class TerminalObjectBuilder(tdef : TerminalDefinition, id : Int) extends ServerObjectBuilder {
import akka.actor.ActorContext
import net.psforever.objects.guid.NumberPoolHub
def Build(implicit context : ActorContext, guid : NumberPoolHub) : Terminal = {
val obj = Terminal(tdef)
guid.register(obj, id)
obj.Actor
obj
}
}
object TerminalObjectBuilder {
def apply(tdef : TerminalDefinition, id : Int) : TerminalObjectBuilder = {
new TerminalObjectBuilder(tdef, id)
}
}

View file

@ -3,10 +3,9 @@ package net.psforever.objects.continent
import akka.actor.{ActorContext, ActorRef, Props} import akka.actor.{ActorContext, ActorRef, Props}
import net.psforever.objects.{PlanetSideGameObject, Player} import net.psforever.objects.{PlanetSideGameObject, Player}
import net.psforever.objects.entity.IdentifiableEntity
import net.psforever.objects.equipment.Equipment import net.psforever.objects.equipment.Equipment
import net.psforever.objects.guid.NumberPoolHub import net.psforever.objects.guid.NumberPoolHub
import net.psforever.objects.guid.actor.{NumberPoolAccessorActor, NumberPoolActor, Register} import net.psforever.objects.guid.actor.{NumberPoolAccessorActor, NumberPoolActor}
import net.psforever.objects.guid.selector.RandomSelector import net.psforever.objects.guid.selector.RandomSelector
import net.psforever.objects.guid.source.LimitedNumberSource import net.psforever.objects.guid.source.LimitedNumberSource
import net.psforever.packet.GamePacket import net.psforever.packet.GamePacket
@ -15,23 +14,24 @@ import net.psforever.types.Vector3
import scala.collection.mutable.ListBuffer import scala.collection.mutable.ListBuffer
class Zone(id : String, zoneNumber : Int, map : String) { class Zone(id : String, map : ZoneMap, zoneNumber : Int) {
private var actor = ActorRef.noSender private var actor = ActorRef.noSender
private var accessor : ActorRef = ActorRef.noSender private var accessor : ActorRef = ActorRef.noSender
private var startupUtilities : List[(PlanetSideGameObject, Int)] = List() //private var startupUtilities : List[ServerObjectBuilder] = List()
private var guid : NumberPoolHub = new NumberPoolHub(new LimitedNumberSource(65536)) private var guid : NumberPoolHub = new NumberPoolHub(new LimitedNumberSource(65536))
def Actor : ActorRef = actor def Actor : ActorRef = actor
def Init(implicit context : ActorContext) : Unit = { def Init(implicit context : ActorContext) : Unit = {
//TODO wrong initialization //TODO wrong initialization
implicit val guid = this.guid
val pool = guid.AddPool("pool", (200 to 1000).toList) val pool = guid.AddPool("pool", (200 to 1000).toList)
pool.Selector = new RandomSelector pool.Selector = new RandomSelector
val poolActor = context.actorOf(Props(classOf[NumberPoolActor], pool), name = s"$ZoneId-poolActor") val poolActor = context.actorOf(Props(classOf[NumberPoolActor], pool), name = s"$ZoneId-poolActor")
accessor = context.actorOf(Props(classOf[NumberPoolAccessorActor], guid, pool, poolActor), s"$ZoneId-accessor") accessor = context.actorOf(Props(classOf[NumberPoolAccessorActor], guid, pool, poolActor), s"$ZoneId-accessor")
StartupUtilities.foreach({case ((obj, uid)) => map.LocalObjects.foreach({builderObject =>
guid.register(obj, uid) builderObject.Build
}) })
} }
@ -48,7 +48,7 @@ class Zone(id : String, zoneNumber : Int, map : String) {
def ZoneNumber : Int = zoneNumber def ZoneNumber : Int = zoneNumber
def Map : String = map def Map : ZoneMap = map
def GUID : ActorRef = accessor def GUID : ActorRef = accessor
@ -70,15 +70,15 @@ class Zone(id : String, zoneNumber : Int, map : String) {
def EquipmentOnGround : ListBuffer[Equipment] = equipmentOnGround def EquipmentOnGround : ListBuffer[Equipment] = equipmentOnGround
def AddUtility(obj : PlanetSideGameObject, id : Int) : Unit = { // def AddUtility(obj : ServerObjectBuilder) : Unit = {
startupUtilities = startupUtilities :+ (obj, id) // startupUtilities = startupUtilities :+ obj
} // }
//
def StartupUtilities : List[(IdentifiableEntity, Int)] = { // def StartupUtilities : List[ServerObjectBuilder] = {
val utilities = startupUtilities // val utilities = startupUtilities
startupUtilities = Nil // startupUtilities = Nil
utilities // utilities
} // }
def ClientInitialization() : List[GamePacket] = { def ClientInitialization() : List[GamePacket] = {
List.empty[GamePacket] List.empty[GamePacket]
@ -90,8 +90,6 @@ class Zone(id : String, zoneNumber : Int, map : String) {
} }
object Zone { object Zone {
final def Nowhere : Zone = { Zone("nowhere", 0, "nowhere") } //TODO needs overrides
final case class DropItemOnGround(item : Equipment, pos : Vector3, orient : Vector3) final case class DropItemOnGround(item : Equipment, pos : Vector3, orient : Vector3)
final case class GetItemOnGround(player : Player, item_guid : PlanetSideGUID) final case class GetItemOnGround(player : Player, item_guid : PlanetSideGUID)
@ -100,7 +98,7 @@ object Zone {
final case class ClientInitialization(list : List[GamePacket]) final case class ClientInitialization(list : List[GamePacket])
def apply(zoneId : String, zoneNumber : Int, map : String) : Zone = { def apply(id : String, map : ZoneMap, number : Int) : Zone = {
new Zone(zoneId, zoneNumber, map) new Zone(id, map, number)
} }
} }

View file

@ -3,7 +3,6 @@ package net.psforever.objects.continent
import akka.actor.Actor import akka.actor.Actor
import net.psforever.objects.equipment.Equipment import net.psforever.objects.equipment.Equipment
import net.psforever.objects.guid.actor.Register
import net.psforever.packet.game.PlanetSideGUID import net.psforever.packet.game.PlanetSideGUID
import scala.annotation.tailrec import scala.annotation.tailrec
@ -13,7 +12,6 @@ class ZoneActor(zone : Zone) extends Actor {
override def preStart() : Unit = { override def preStart() : Unit = {
super.preStart() super.preStart()
log.info(s"Calling ${zone.ZoneId} init ...")
zone.Init zone.Init
} }

View file

@ -0,0 +1,18 @@
// Copyright (c) 2017 PSForever
package net.psforever.objects.continent
class ZoneMap(private val name : String) {
private var localObjects : List[ServerObjectBuilder] = List()
def Name : String = name
def LocalObject(obj : ServerObjectBuilder) : Unit = {
localObjects = localObjects :+ obj
}
def LocalObjects : List[ServerObjectBuilder] = {
val utilities = localObjects
localObjects = Nil
utilities
}
}

View file

@ -12,9 +12,8 @@ import ch.qos.logback.core.status._
import ch.qos.logback.core.util.StatusPrinter import ch.qos.logback.core.util.StatusPrinter
import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigFactory
import net.psforever.crypto.CryptoInterface import net.psforever.crypto.CryptoInterface
import net.psforever.objects.continent.{IntergalacticCluster, Zone} import net.psforever.objects.continent.{IntergalacticCluster, TerminalObjectBuilder, Zone, ZoneMap}
import net.psforever.objects.guid.TaskResolver import net.psforever.objects.guid.TaskResolver
import net.psforever.objects.terminals.{OrderTerminalDefinition, Terminal}
import org.slf4j import org.slf4j
import org.fusesource.jansi.Ansi._ import org.fusesource.jansi.Ansi._
import org.fusesource.jansi.Ansi.Color._ import org.fusesource.jansi.Ansi.Color._
@ -221,22 +220,13 @@ object PsLogin {
} }
def createContinents() : List[Zone] = { def createContinents() : List[Zone] = {
val home3 = new Zone("home3",13,"map13") { val map13 = new ZoneMap("map13") {
override def Init(implicit context : ActorContext) : Unit = { import net.psforever.objects.GlobalDefinitions._
val orderTerm = new OrderTerminalDefinition LocalObject(TerminalObjectBuilder(orderTerminal, 853))
val obj853 = Terminal(orderTerm) LocalObject(TerminalObjectBuilder(orderTerminal, 855))
val obj855 = Terminal(orderTerm) LocalObject(TerminalObjectBuilder(orderTerminal, 860))
val obj860 = Terminal(orderTerm)
AddUtility(obj853, 853)
AddUtility(obj855, 855)
AddUtility(obj860, 860)
super.Init
obj853.Actor
obj855.Actor
obj860.Actor
}
} }
val home3 = Zone("home3", map13, 13)
home3 :: home3 ::
Nil Nil

View file

@ -34,7 +34,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
var avatarService = Actor.noSender var avatarService = Actor.noSender
var taskResolver = Actor.noSender var taskResolver = Actor.noSender
var galaxy = Actor.noSender var galaxy = Actor.noSender
var continent : Zone = Zone.Nowhere var continent : Zone = null
var clientKeepAlive : Cancellable = WorldSessionActor.DefaultCancellable var clientKeepAlive : Cancellable = WorldSessionActor.DefaultCancellable
@ -358,7 +358,6 @@ class WorldSessionActor extends Actor with MDCContextAware {
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttribute(tplayer.GUID, 4, tplayer.Armor)) avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttribute(tplayer.GUID, 4, tplayer.Armor))
//re-draw equipment held in free hand //re-draw equipment held in free hand
beforeFreeHand match { beforeFreeHand match {
//TODO was any previous free hand item deleted?
case Some(item) => case Some(item) =>
tplayer.FreeHand.Equipment = beforeFreeHand tplayer.FreeHand.Equipment = beforeFreeHand
val definition = item.Definition val definition = item.Definition
@ -424,15 +423,8 @@ class WorldSessionActor extends Actor with MDCContextAware {
case PlayerFailedToLoad(tplayer) => case PlayerFailedToLoad(tplayer) =>
player.Continent match { player.Continent match {
case "tzshvs" =>
failWithError(s"$tplayer failed to load anywhere")
//self ! IntergalacticCluster.GiveWorld("", Zone.Nowhere)
case "tzdrvs" =>
galaxy ! IntergalacticCluster.GetWorld("tzshvs")
case "home3" =>
galaxy ! IntergalacticCluster.GetWorld("tzdrvs")
case _ => case _ =>
galaxy ! IntergalacticCluster.GetWorld("home3") failWithError(s"$tplayer failed to load anywhere")
} }
case Zone.ClientInitialization(/*initList*/_) => case Zone.ClientInitialization(/*initList*/_) =>
@ -470,7 +462,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
case IntergalacticCluster.ClientInitializationComplete(tplayer)=> case IntergalacticCluster.ClientInitializationComplete(tplayer)=>
//this will cause the client to send back a BeginZoningMessage packet (see below) //this will cause the client to send back a BeginZoningMessage packet (see below)
sendResponse(PacketCoding.CreateGamePacket(0, LoadMapMessage(continent.Map, continent.ZoneId, 40100,25,true,3770441820L))) //VS Sanctuary sendResponse(PacketCoding.CreateGamePacket(0, LoadMapMessage(continent.Map.Name, continent.ZoneId, 40100,25,true,3770441820L))) //VS Sanctuary
log.info("Load the now-registered player") log.info("Load the now-registered player")
//load the now-registered player //load the now-registered player
tplayer.Spawn tplayer.Spawn
@ -585,7 +577,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
} }
import net.psforever.objects.GlobalDefinitions._ import net.psforever.objects.GlobalDefinitions._
//this part is created by the player (should be in case of ConnectToWorldRequestMessage, maybe) //this part is created by WSA based on the database query (should be in case of ConnectToWorldRequestMessage, maybe)
val energy_cell_box1 = AmmoBox(energy_cell) val energy_cell_box1 = AmmoBox(energy_cell)
val energy_cell_box2 = AmmoBox(energy_cell, 16) val energy_cell_box2 = AmmoBox(energy_cell, 16)
val bullet_9mm_box1 = AmmoBox(bullet_9mm) val bullet_9mm_box1 = AmmoBox(bullet_9mm)
@ -609,7 +601,6 @@ class WorldSessionActor extends Actor with MDCContextAware {
player = Player("IlllIIIlllIlIllIlllIllI", PlanetSideEmpire.VS, CharacterGender.Female, 41, 1) player = Player("IlllIIIlllIlIllIlllIllI", PlanetSideEmpire.VS, CharacterGender.Female, 41, 1)
player.Position = Vector3(3674.8438f, 2726.789f, 91.15625f) player.Position = Vector3(3674.8438f, 2726.789f, 91.15625f)
player.Orientation = Vector3(0f, 0f, 90f) player.Orientation = Vector3(0f, 0f, 90f)
//player.Continent = "home3"
player.Slot(0).Equipment = beamer1 player.Slot(0).Equipment = beamer1
player.Slot(2).Equipment = suppressor1 player.Slot(2).Equipment = suppressor1
player.Slot(4).Equipment = forceblade1 player.Slot(4).Equipment = forceblade1
@ -621,57 +612,6 @@ class WorldSessionActor extends Actor with MDCContextAware {
player.Slot(39).Equipment = rek player.Slot(39).Equipment = rek
player.Slot(5).Equipment.get.asInstanceOf[LockerContainer].Inventory += 0 -> extra_rek player.Slot(5).Equipment.get.asInstanceOf[LockerContainer].Inventory += 0 -> extra_rek
//for player2
val energy_cell_box3 = AmmoBox(PlanetSideGUID(187), energy_cell)
val energy_cell_box4 = AmmoBox(PlanetSideGUID(177), energy_cell, 16)
val bullet_9mm_box5 = AmmoBox(PlanetSideGUID(183), bullet_9mm)
val bullet_9mm_box6 = AmmoBox(PlanetSideGUID(184), bullet_9mm)
val bullet_9mm_box7 = AmmoBox(PlanetSideGUID(185), bullet_9mm)
val bullet_9mm_box8 = AmmoBox(PlanetSideGUID(179), bullet_9mm, 25)
val bullet_9mm_AP_box2 = AmmoBox(PlanetSideGUID(186), bullet_9mm_AP)
val melee_ammo_box2 = AmmoBox(PlanetSideGUID(181), melee_ammo)
val
beamer2 = Tool(PlanetSideGUID(176), beamer)
beamer2.AmmoSlots.head.Box = energy_cell_box4
val
suppressor2 = Tool(PlanetSideGUID(178), suppressor)
suppressor2.AmmoSlots.head.Box = bullet_9mm_box8
val
forceblade2 = Tool(PlanetSideGUID(180), forceblade)
forceblade2.AmmoSlots.head.Box = melee_ammo_box2
val
rek2 = SimpleItem(PlanetSideGUID(188), remote_electronics_kit)
val
player2 = Player(PlanetSideGUID(275), "Doppelganger", PlanetSideEmpire.NC, CharacterGender.Female, 41, 1)
player2.Position = Vector3(3680f, 2726.789f, 91.15625f)
player2.Orientation = Vector3(0f, 0f, 0f)
player2.Continent = "home3"
player2.Slot(0).Equipment = beamer2
player2.Slot(2).Equipment = suppressor2
player2.Slot(4).Equipment = forceblade2
player2.Slot(5).Equipment.get.GUID = PlanetSideGUID(182)
player2.Slot(6).Equipment = bullet_9mm_box5
player2.Slot(9).Equipment = bullet_9mm_box6
player2.Slot(12).Equipment = bullet_9mm_box7
player2.Slot(33).Equipment = bullet_9mm_AP_box2
player2.Slot(36).Equipment = energy_cell_box3
player2.Slot(39).Equipment = rek2
player2.Spawn
val hellfire_ammo_box = AmmoBox(PlanetSideGUID(432), hellfire_ammo)
val
fury1 = Vehicle(PlanetSideGUID(313), fury)
fury1.Faction = PlanetSideEmpire.VS
fury1.Position = Vector3(3674.8438f, 2732f, 91.15625f)
fury1.Orientation = Vector3(0.0f, 0.0f, 90.0f)
fury1.WeaponControlledFromSeat(0).get.GUID = PlanetSideGUID(300)
fury1.WeaponControlledFromSeat(0).get.AmmoSlots.head.Box = hellfire_ammo_box
val object2Hex = ObjectCreateMessage(ObjectClass.avatar, PlanetSideGUID(275), player2.Definition.Packet.ConstructorData(player2).get)
val furyHex = ObjectCreateMessage(ObjectClass.fury, PlanetSideGUID(313), fury1.Definition.Packet.ConstructorData(fury1).get)
def handleGamePkt(pkt : PlanetSideGamePacket) = pkt match { def handleGamePkt(pkt : PlanetSideGamePacket) = pkt match {
case ConnectToWorldRequestMessage(server, token, majorVersion, minorVersion, revision, buildDate, unk) => case ConnectToWorldRequestMessage(server, token, majorVersion, minorVersion, revision, buildDate, unk) =>
val clientVersion = s"Client Version: $majorVersion.$minorVersion.$revision, $buildDate" val clientVersion = s"Client Version: $majorVersion.$minorVersion.$revision, $buildDate"
@ -712,8 +652,6 @@ class WorldSessionActor extends Actor with MDCContextAware {
//TODO continent.ClientConfiguration() //TODO continent.ClientConfiguration()
sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(2), PlanetSideEmpire.VS))) //HART building C sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(2), PlanetSideEmpire.VS))) //HART building C
sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(29), PlanetSideEmpire.NC))) //South Villa Gun Tower sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(29), PlanetSideEmpire.NC))) //South Villa Gun Tower
//sendResponse(PacketCoding.CreateGamePacket(0, object2Hex))
//sendResponse(PacketCoding.CreateGamePacket(0, furyHex))
sendResponse(PacketCoding.CreateGamePacket(0, TimeOfDayMessage(1191182336))) sendResponse(PacketCoding.CreateGamePacket(0, TimeOfDayMessage(1191182336)))
sendResponse(PacketCoding.CreateGamePacket(0, ReplicationStreamMessage(5, Some(6), Vector(SquadListing())))) //clear squad list sendResponse(PacketCoding.CreateGamePacket(0, ReplicationStreamMessage(5, Some(6), Vector(SquadListing())))) //clear squad list