Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions src/main/scala/li/cil/oc/common/entity/Drone.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import li.cil.oc.common.{EventHandler, menu}
import li.cil.oc.integration.util.Wrench
import li.cil.oc.server.{agent, component}
import li.cil.oc.util.ExtendedLevel._
import li.cil.oc.util.ExtendedNBT._
import li.cil.oc.util.ExtendedDataComponentHolder._
import li.cil.oc.util.{BlockPosition, InventoryUtils}
import net.minecraft.core.component.DataComponentHolder
Expand All @@ -24,7 +23,7 @@ import net.minecraft.nbt.CompoundTag
import net.minecraft.network.chat.Component
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket
import net.minecraft.network.syncher.{EntityDataAccessor, EntityDataSerializers, SynchedEntityData}
import net.minecraft.server.level.{ServerEntity, ServerLevel, ServerPlayer}
import net.minecraft.server.level.{ServerEntity, ServerPlayer}
import net.minecraft.util.ColorRGBA
import net.minecraft.world.entity._
import net.minecraft.world.entity.item.ItemEntity
Expand All @@ -36,7 +35,6 @@ import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.portal.DimensionTransition
import net.minecraft.world.phys.Vec3
import net.minecraft.world.{InteractionHand, InteractionResult, MenuProvider}
import net.neoforged.api.distmarker.{Dist, OnlyIn}
import net.neoforged.neoforge.common.MutableDataComponentHolder
import net.neoforged.neoforge.fluids.IFluidTank

Expand Down Expand Up @@ -65,7 +63,7 @@ abstract class DroneInventory(val drone: Drone) extends Inventory
// someone decides to ship that specific version of the API.
class Drone(selfType: EntityType[Drone], level: Level) extends Entity(selfType, level) with MachineHost with internal.Drone with internal.Rotatable with Analyzable with Context with Persistable {
override def getEnvironmentLevel: Level = level

// Some basic constants.
val gravity = 0.05f
// low for slow fall (float down)
Expand Down Expand Up @@ -228,7 +226,6 @@ class Drone(selfType: EntityType[Drone], level: Level) extends Entity(selfType,

override def markChanged(): Unit = {}

@OnlyIn(Dist.CLIENT)
override def getRopeHoldPosition(dt: Float): Vec3 =
getPosition(dt).add(0.0, -0.056, 0.0) // Offset: height * 0.85 * 0.7 - 0.25

Expand Down Expand Up @@ -278,7 +275,7 @@ class Drone(selfType: EntityType[Drone], level: Level) extends Entity(selfType,
builder.define(Drone.DataLightColor, Int.box(0x66DD55))
}

def initializeAfterPlacement(stack: ItemStack, player: Player, position: Vec3): Unit = {
def initializeAfterPlacement(stack: ItemStack, position: Vec3): Unit = {
info.loadData(stack)
control.node.changeBuffer(info.storedEnergy - control.node.localBuffer)
wireThingsTogether()
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/li/cil/oc/common/init/OCItems.scala
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ object OCItems extends ItemAPI {
val DiskDriveMountable: DeferredItem[item.DiskDriveMountable] = registerItem(new item.DiskDriveMountable(defaultProps.stacksTo(1)), Constants.ItemName.DiskDriveMountable)

// 1.9
val RAMCreative: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RAMCreative, defaultProps.rarity(Rarity.EPIC))
val RAMCreative: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps.rarity(Rarity.EPIC), "creativememory"), Constants.ItemName.RAMCreative)
val CapacitorMountable: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CapacitorMountable, defaultProps.stacksTo(1))

// Card components.
Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/li/cil/oc/common/item/Acid.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ import net.minecraft.world.effect.MobEffects
import net.neoforged.neoforge.common.extensions.IItemExtension

class Acid(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension {
override def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = {
player.startUsingItem(if (player.getItemInHand(InteractionHand.MAIN_HAND) == stack) InteractionHand.MAIN_HAND else InteractionHand.OFF_HAND)
new InteractionResultHolder(InteractionResult.sidedSuccess(level.isClientSide), stack)
override def use(level: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = {
player.startUsingItem(hand)
InteractionResultHolder.sidedSuccess(player.getItemInHand(hand), level.isClientSide)
}

override def getUseAnimation(stack: ItemStack): UseAnim = UseAnim.DRINK
Expand Down
58 changes: 30 additions & 28 deletions src/main/scala/li/cil/oc/common/item/Analyzer.scala
Original file line number Diff line number Diff line change
@@ -1,33 +1,25 @@
package li.cil.oc.common.item

import li.cil.oc.Constants
import li.cil.oc.Localization
import li.cil.oc.Settings
import li.cil.oc.api
import li.cil.oc.{api, Constants, Localization, Settings}
import li.cil.oc.api.machine.Machine
import li.cil.oc.api.network.Analyzable
import li.cil.oc.api.network._
import li.cil.oc.common.blockentity
import li.cil.oc.server.PacketSender
import li.cil.oc.util.{BlockPosition, ItemUtils}
import li.cil.oc.util.ExtendedLevel._
import li.cil.oc.util.ExtendedItemStack._
import net.minecraft.world.item.Item
import net.minecraft.world.item.Item.Properties
import net.minecraft.world.item.ItemStack
import li.cil.oc.util.ItemUtils
import net.minecraft.core.Direction
import net.minecraft.Util
import net.minecraft.core.component.DataComponents
import net.minecraft.world.entity.player.Player
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.level.Level
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.{InteractionHand, InteractionResult, InteractionResultHolder}
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.{Item, ItemStack}
import net.minecraft.world.item.Item.Properties
import net.minecraft.world.item.component.CustomData
import net.minecraft.world.item.context.UseOnContext
import net.minecraft.world.level.Level
import net.neoforged.bus.api.SubscribeEvent
import net.neoforged.neoforge.common.extensions.IItemExtension
import net.neoforged.neoforge.common.util.FakePlayer
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent
import net.neoforged.neoforge.common.extensions.IItemExtension

object Analyzer {
private lazy val analyzer = api.Items.get(Constants.ItemName.Analyzer)
Expand Down Expand Up @@ -109,32 +101,42 @@ object Analyzer {
}

class Analyzer(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension {
override def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = {
override def use(level: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = {
val stack = player.getItemInHand(hand)
if (player.isCrouching) {
CustomData.update(DataComponents.CUSTOM_DATA, stack, data => {
data.remove(Settings.namespace + "clipboard")
})

return InteractionResultHolder.sidedSuccess(stack, level.isClientSide)
}

super.use(stack, level, player)
super.use(level, player, hand)
}

override def onItemUse(stack: ItemStack, player: Player, position: BlockPosition, side: Direction, hitX: Float, hitY: Float, hitZ: Float) = {
val world = player.level
val tag = ItemUtils.getTag(stack)
world.getBlockEntity(position) match {
case screen: blockentity.Screen if side == screen.facing =>
if (player.isCrouching) {
override def useOn(ctx: UseOnContext): InteractionResult = {
val world = ctx.getLevel
val tag = ItemUtils.getTag(ctx.getItemInHand)
val hitX = (ctx.getClickLocation.x - ctx.getClickedPos.getX).toFloat
val hitY = (ctx.getClickLocation.y - ctx.getClickedPos.getY).toFloat
val hitZ = (ctx.getClickLocation.z - ctx.getClickedPos.getZ).toFloat

val result = world.getBlockEntity(ctx.getClickedPos) match {
case screen: blockentity.Screen if ctx.getClickedFace == screen.facing =>
if (ctx.isSecondaryUseActive) {
screen.copyToAnalyzer(hitX, hitY, hitZ)
}
else if (tag != null && tag.contains(Settings.namespace + "clipboard")) {
if (!world.isClientSide) {
screen.origin.buffer.clipboard(tag.getString(Settings.namespace + "clipboard"), player)
if (!world.isClientSide && ctx.getPlayer != null) {
screen.origin.buffer.clipboard(tag.getString(Settings.namespace + "clipboard"), ctx.getPlayer)
}
true
}
else false
case _ => Analyzer.analyze(position.world.get.getBlockEntity(position), player, side, hitX, hitY, hitZ)
case be if ctx.getPlayer != null => Analyzer.analyze(be, ctx.getPlayer, ctx.getClickedFace, hitX, hitY, hitZ)
case _ => false
}

if (result) InteractionResult.sidedSuccess(world.isClientSide) else InteractionResult.PASS
}
}
20 changes: 8 additions & 12 deletions src/main/scala/li/cil/oc/common/item/Chamelium.scala
Original file line number Diff line number Diff line change
@@ -1,26 +1,22 @@
package li.cil.oc.common.item

import li.cil.oc.Settings
import net.minecraft.world.level.Level
import net.minecraft.world.item.ItemStack
import net.minecraft.world.effect.{MobEffectInstance, MobEffects}
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.effect.MobEffectInstance
import net.minecraft.world.effect.MobEffects
import net.minecraft.world.item.UseAnim
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.level.Level
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.{Item, ItemStack, UseAnim}
import net.minecraft.world.item.Item.Properties
import net.minecraft.world.item.Item
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.{InteractionHand, InteractionResultHolder}
import net.neoforged.neoforge.common.extensions.IItemExtension

class Chamelium(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension {
override def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = {
override def use(level: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = {
if (Settings.get.chameliumEdible) {
player.startUsingItem(if (player.getItemInHand(InteractionHand.MAIN_HAND) == stack) InteractionHand.MAIN_HAND else InteractionHand.OFF_HAND)
player.startUsingItem(hand)
}
new InteractionResultHolder(InteractionResult.sidedSuccess(level.isClientSide), stack)

InteractionResultHolder.sidedSuccess(player.getItemInHand(hand), level.isClientSide)
}

override def getUseAnimation(stack: ItemStack): UseAnim = UseAnim.EAT
Expand Down
23 changes: 10 additions & 13 deletions src/main/scala/li/cil/oc/common/item/DebugCard.scala
Original file line number Diff line number Diff line change
@@ -1,22 +1,19 @@
package li.cil.oc.common.item

import java.util
import li.cil.oc.Settings
import li.cil.oc.Settings.DebugCardAccess
import li.cil.oc.common.item.data.DebugCardData
import li.cil.oc.server.component.{DebugCard => CDebugCard}
import net.minecraft.world.item.Item
import net.minecraft.network.chat.Component
import net.minecraft.world.item.Item.Properties
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.{Item, ItemStack}
import net.minecraft.world.level.Level
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionHand
import net.minecraft.network.chat.Component
import net.minecraft.world.{InteractionHand, InteractionResult, InteractionResultHolder}
import net.minecraft.world.entity.player.Player
import net.minecraft.Util
import net.neoforged.neoforge.common.extensions.IItemExtension

import java.util

class DebugCard(props: Properties) extends Item(props) with traits.ComponentItem with IItemExtension {

override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[Component]): Unit = {
Expand All @@ -25,7 +22,8 @@ class DebugCard(props: Properties) extends Item(props) with traits.ComponentItem
data.access.foreach(access => tooltip.add(Component.literal(s"§8${access.player}§r")))
}

override def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = {
override def use(level: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = {
val stack = player.getItemInHand(hand)
if (!level.isClientSide && player.isCrouching) {
val data = new DebugCardData(stack)
val name = player.getName
Expand All @@ -37,16 +35,15 @@ class DebugCard(props: Properties) extends Item(props) with traits.ComponentItem
case Some(n) => n
case None =>
player.sendSystemMessage(Component.literal("§cYou are not whitelisted to use debug card"))
player.swing(InteractionHand.MAIN_HAND)
return new InteractionResultHolder[ItemStack](InteractionResult.FAIL, stack)
return InteractionResultHolder.sidedSuccess(stack, level.isClientSide)
}

case _ => ""
}))

data.saveData(stack)
player.swing(InteractionHand.MAIN_HAND)
}
new InteractionResultHolder(InteractionResult.sidedSuccess(level.isClientSide), stack)

InteractionResultHolder.sidedSuccess(stack, level.isClientSide)
}
}
49 changes: 17 additions & 32 deletions src/main/scala/li/cil/oc/common/item/Debugger.scala
Original file line number Diff line number Diff line change
@@ -1,44 +1,29 @@
package li.cil.oc.common.item

import li.cil.oc.OpenComputers
import li.cil.oc.api
import li.cil.oc.{api, OpenComputers}
import li.cil.oc.api.network._
import li.cil.oc.util.BlockPosition
import li.cil.oc.util.ExtendedLevel._
import net.minecraft.world.item.Item
import net.minecraft.world.item.Item.Properties
import net.minecraft.world.item.ItemStack
import net.minecraft.core.Direction
import net.minecraft.world.entity.player.Player
import net.minecraft.server.level.ServerPlayer
import net.neoforged.neoforge.common.util.FakePlayer
import net.minecraft.world.InteractionResult
import net.minecraft.world.item.context.UseOnContext
import net.neoforged.neoforge.common.extensions.IItemExtension
import net.neoforged.neoforge.common.util.FakePlayer

class Debugger(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension {
override def onItemUse(stack: ItemStack, player: Player, position: BlockPosition, side: Direction, hitX: Float, hitY: Float, hitZ: Float) = {
val world = position.world.get
player match {
case _: FakePlayer => false // Nope
case realPlayer: ServerPlayer =>
world.getBlockEntity(position) match {
case host: SidedEnvironment =>
if (!world.isClientSide) {
Debugger.reconnect(Array(host.sidedNode(side)))
}
true
case host: Environment =>
if (!world.isClientSide) {
Debugger.reconnect(Array(host.node))
}
true
case _ =>
if (!world.isClientSide) {
Debugger.node.remove()
}
true
}
case _ => false
override def useOn(ctx: UseOnContext): InteractionResult = {
val world = ctx.getLevel
if (ctx.getPlayer == null || ctx.getPlayer.isInstanceOf[FakePlayer]) return InteractionResult.FAIL

world.getBlockEntity(ctx.getClickedPos) match {
case host: SidedEnvironment =>
if (!world.isClientSide) Debugger.reconnect(Array(host.sidedNode(ctx.getClickedFace)))
case host: Environment =>
if (!world.isClientSide) Debugger.reconnect(Array(host.node))
case _ =>
if (!world.isClientSide) Debugger.node.remove()
Comment on lines +17 to +23

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be better to wrap this entire match in if (!world.isClientSide0 ... since every individual case checks for this, but maybe I don't understand Scala enough to understand why it can't/shouldn't be done that way...

}

InteractionResult.sidedSuccess(world.isClientSide)
}
}

Expand Down
20 changes: 8 additions & 12 deletions src/main/scala/li/cil/oc/common/item/DiskDriveMountable.scala
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package li.cil.oc.common.item

import li.cil.oc.OpenComputers
import li.cil.oc.common.menu.MenuTypes
import li.cil.oc.common.container.DiskDriveMountableInventory
import net.minecraft.world.item.Item
import li.cil.oc.common.menu.MenuTypes
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.{InteractionHand, InteractionResultHolder}
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.{Item, ItemStack}
import net.minecraft.world.item.Item.Properties
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
import net.minecraft.world.entity.player.Player
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionResultHolder
import net.neoforged.neoforge.common.extensions.IItemExtension

class DiskDriveMountable(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension {
override def use(stack: ItemStack, level: Level, player: Player) = {
override def use(level: Level, player: Player, hand: InteractionHand) = {
val stack = player.getItemInHand(hand)
if (!level.isClientSide) player match {
case srvPlr: ServerPlayer => MenuTypes.openDiskDriveGui(srvPlr, new DiskDriveMountableInventory {
override def container: ItemStack = stack
Expand All @@ -24,7 +21,6 @@ class DiskDriveMountable(props: Properties) extends Item(props) with traits.Simp
})
case _ =>
}
player.swing(InteractionHand.MAIN_HAND)
new InteractionResultHolder(InteractionResult.sidedSuccess(level.isClientSide), stack)
InteractionResultHolder.sidedSuccess(stack, level.isClientSide)
}
}
Loading
Loading