From 8cccc17ace3e2317b3ae0c32085940165f3c5ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 5 Dec 2014 14:12:11 +0100 Subject: [PATCH] Added robot.uuidFormat setting to control UUIDs assigned to robots' fake players. See comment in config for usage. Disclaimer: relatively untested. --- src/main/resources/application.conf | 10 ++++++++++ src/main/scala/li/cil/oc/Settings.scala | 1 + .../scala/li/cil/oc/common/block/RobotProxy.scala | 2 +- .../scala/li/cil/oc/common/tileentity/Robot.scala | 12 ++++++++++++ .../li/cil/oc/server/component/robot/Player.scala | 2 +- 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 997d74e41..30371992e 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -304,6 +304,16 @@ opencomputers { # block from another mod, the name will default to 'OpenComputers'. nameFormat: "$player$.robot" + # Controls the UUID robots are given. You can either specify a fixed UUID + # here or use the two provided variables: + # - $random$, which will assign each robot a random UUID. + # - $player$, which assigns to each placed robot the UUID of the player + # that placed it (note: if robots are placed by fake players, i.e. + # other mods' blocks, they will get that mods' fake player's profile!) + # Note that if no player UUID is available this will be the same as + # $random$. + uuidFormat: "$player$" + # This controls how fast robots gain experience, and how that experience # alters the stats. xp { diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 2524b833d..3ee3adc0b 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -96,6 +96,7 @@ class Settings(val config: Config) { val useAndPlaceRange = config.getDouble("robot.useAndPlaceRange") val itemDamageRate = config.getDouble("robot.itemDamageRate") max 0 min 1 val nameFormat = config.getString("robot.nameFormat") + val uuidFormat = config.getString("robot.uuidFormat") // robot.xp val baseXpToLevel = config.getDouble("robot.xp.baseValue") max 0 diff --git a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala index ffe9edf8c..75ee9cf74 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala @@ -185,7 +185,7 @@ class RobotProxy extends RedstoneAware with traits.SpecialBlock { }) match { case Some((robot, owner, uuid)) => robot.owner = owner - robot.ownerUuid = uuid + robot.ownerUuid = Option(robot.determineUUID(uuid)) robot.info.load(stack) robot.bot.node.changeBuffer(robot.info.robotEnergy - robot.bot.node.localBuffer) robot.updateInventorySize() diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index a708b1609..08a8d3a8f 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -124,6 +124,18 @@ class Robot extends traits.Computer with traits.PowerInformation with IFluidHand private lazy val player_ = new robot.Player(this) + def determineUUID(playerUUID: Option[UUID] = None) = { + val format = Settings.get.uuidFormat + val randomUUID = UUID.randomUUID() + try UUID.fromString(format. + replaceAllLiterally("$random$", randomUUID.toString). + replaceAllLiterally("$player$", playerUUID.map(_.toString).getOrElse(randomUUID.toString))) catch { + case t: Throwable => + OpenComputers.log.warn("Failed determining robot UUID, check your config's `uuidFormat` entry!", t) + randomUUID + } + } + // ----------------------------------------------------------------------- // def name = info.name diff --git a/src/main/scala/li/cil/oc/server/component/robot/Player.scala b/src/main/scala/li/cil/oc/server/component/robot/Player.scala index 3c3c312a6..c44b999a5 100644 --- a/src/main/scala/li/cil/oc/server/component/robot/Player.scala +++ b/src/main/scala/li/cil/oc/server/component/robot/Player.scala @@ -49,7 +49,7 @@ import scala.reflect._ object Player { def profileFor(robot: tileentity.Robot) = { - val uuid = robot.ownerUuid.getOrElse(UUID.randomUUID()) + val uuid = robot.ownerUuid.getOrElse(robot.determineUUID()) val randomId = (robot.world.rand.nextInt(0xFFFFFF) + 1).toString val name = Settings.get.nameFormat. replace("$player$", robot.owner).