blob: 272f5f48a74cb80eff3c81954aeae5c6ac78c462 [file] [log] [blame] [raw]
package li.cil.oc.common.event
import cpw.mods.fml.common.eventhandler.SubscribeEvent
import li.cil.oc.Localization
import li.cil.oc.Settings
import li.cil.oc.api.event._
import li.cil.oc.api.internal.Agent
import li.cil.oc.api.internal.Robot
import li.cil.oc.api.network.Node
import li.cil.oc.server.component
import org.lwjgl.opengl.GL11
import scala.collection.convert.WrapAsScala._
object ExperienceUpgradeHandler {
@SubscribeEvent
def onRobotAnalyze(e: RobotAnalyzeEvent) {
val (level, experience) = getLevelAndExperience(e.agent)
// This is basically a 'does it have an experience upgrade' check.
if (experience != 0.0) {
e.player.addChatMessage(Localization.Analyzer.RobotXp(experience, level))
}
}
@SubscribeEvent
def onRobotComputeDamageRate(e: RobotUsedToolEvent.ComputeDamageRate) {
e.setDamageRate(e.getDamageRate * math.max(0, 1 - getLevel(e.agent) * Settings.get.toolEfficiencyPerLevel))
}
@SubscribeEvent
def onRobotBreakBlockPre(e: RobotBreakBlockEvent.Pre) {
val boost = math.max(0, 1 - getLevel(e.agent) * Settings.get.harvestSpeedBoostPerLevel)
e.setBreakTime(e.getBreakTime * boost)
}
@SubscribeEvent
def onRobotAttackEntityPost(e: RobotAttackEntityEvent.Post) {
e.agent match {
case robot: Robot =>
if (robot.equipmentInventory.getStackInSlot(0) != null && e.target.isDead) {
addExperience(robot, Settings.get.robotActionXp)
}
case _ =>
}
}
@SubscribeEvent
def onRobotBreakBlockPost(e: RobotBreakBlockEvent.Post) {
addExperience(e.agent, e.experience * Settings.get.robotOreXpRate + Settings.get.robotActionXp)
}
@SubscribeEvent
def onRobotPlaceBlockPost(e: RobotPlaceBlockEvent.Post) {
addExperience(e.agent, Settings.get.robotActionXp)
}
@SubscribeEvent
def onRobotMovePost(e: RobotMoveEvent.Post) {
addExperience(e.agent, Settings.get.robotExhaustionXpRate * 0.01)
}
@SubscribeEvent
def onRobotExhaustion(e: RobotExhaustionEvent) {
addExperience(e.agent, Settings.get.robotExhaustionXpRate * e.exhaustion)
}
@SubscribeEvent
def onRobotRender(e: RobotRenderEvent) {
val level = e.agent match {
case robot: Robot =>
var acc = 0
for (index <- 0 until robot.getSizeInventory) {
robot.getComponentInSlot(index) match {
case upgrade: component.UpgradeExperience =>
acc += upgrade.level
case _ =>
}
}
acc
case _ => 0
}
if (level > 19) {
GL11.glColor3f(0.4f, 1, 1)
}
else if (level > 9) {
GL11.glColor3f(1, 1, 0.4f)
}
else {
GL11.glColor3f(0.5f, 0.5f, 0.5f)
}
}
private def getLevel(agent: Agent) = {
var level = 0
foreachUpgrade(agent.machine.node, upgrade => level += upgrade.level)
level
}
private def getLevelAndExperience(agent: Agent) = {
var level = 0
var experience = 0.0
foreachUpgrade(agent.machine.node, upgrade => {
level += upgrade.level
experience += upgrade.experience
})
(level, experience)
}
private def addExperience(agent: Agent, amount: Double) {
foreachUpgrade(agent.machine.node, upgrade => upgrade.addExperience(amount))
}
private def foreachUpgrade(node: Node, f: (component.UpgradeExperience) => Unit): Unit = {
node.reachableNodes.foreach(_.host match {
case upgrade: component.UpgradeExperience => f(upgrade)
case _ =>
})
}
}