Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

OK,

So I'm trying to set the properties of a tile entity by the speed of the fastest entity near to it. I have the following method setup, (code is in Scala but I can translate if required)


  override def update(): Unit = {
    if (!this.getWorld.isRemote) {

      val ents = this.getWorld.getEntitiesWithinAABB(classOf[EntityLivingBase], new AxisAlignedBB(getPos.getX-3, getPos.getY-3, getPos.getZ-3, getPos.getX+3, getPos.getY+3, getPos.getZ+3))

      val speeds: List[Double] = ents.map(e => {
        val vx = e.motionX
        val vy = e.motionY
        val vz = e.motionZ
        println(List(vx, vy, vz))

        vx**2 + vy**2 + vz**2
      }).sortWith((d0, d1) => d0 > d1).toList

      val speed: Double = speeds.headOption.getOrElse[Double](0) ** .5
      powerLevel = Math.min(speed * 15, 15).toInt
      println(powerLevel)

      var state = BlockMotionSensor.getDefaultState
      state = state.withProperty[integer, Integer](ModBlocks.meta, powerLevel)

      this.getWorld.setBlockState(this.getPos, state)
    }
  }

 

for my entity player (only tested so far on single player) velocities are printed as

List(0.0, -0.07544406518948656, 0.0)

, with y increasing if I jump, but x and z never change. Testing on pigs (we do not fear animal testing here) showed that pigs do have velocity in all three directions using the above code. Any suggestions on what I'm missing? or is this a bug in the latest forge (1.9-12.16.0.1816)

  • Author

OK, so there is a motionX/Z when the player jumps while sprinting... I'm guessing that the payer motion when walking on the ground or jumping normally is just dictated by a setPos from the key bindings (maybe?) any ideas for a work around?

  • Author

found a work around, substituted each motion with

e.posZ - e.lastTickPosZ

. had forgotten the last tick position was saved to that

  • Author

previous turned out not to work... was a little premature there. back to square 0, any ideas?

 

[Edit] can also rule out moveForward and moveStrafing [/Edit]

Hi

 

I think the most robust solution might be to have your TileEntity keep track of each nearby entity's location from tick to tick, and calculate the speed from that.

 

eg - in your TileEntity tick method

(1) look for nearby entities

(2) store all nearby entities in a map along with their current [x,y,z].

(3) compare the entity positions this tick with the positions from last tick  -> calculate the speed.

 

motionX, motionY, motionZ don't always give reliable answers because some entities have custom movement (like the player for example).

 

-TGG

 

 

  • Author

Awesome. tried this last night and it didn't as the block was getting replaced, and therefore so was the tile entity. changed the code so that rather than doing it from the state it reads the value from the tile entity and updates the neighbors. I have to keep an array of the previous values though to try and smooth it out a bit, otherwise it flickers on and off quite a bit

 

  var powerLevel: Int = 0
  var prevEnts: Map[EntityLivingBase, Vec3d] = Map()
  var postMax: List[Double] = new Array(10).toList

  override def update(): Unit = {
    if (!this.getWorld.isRemote) {
      val entList: List[EntityLivingBase] = getWorld.getEntitiesWithinAABB(classOf[EntityLivingBase],
        new AxisAlignedBB(this.getPos.getX-4, this.getPos.getY-4, this.getPos.getZ-4,this.getPos.getX+4, this.getPos.getY+4, this.getPos.getZ+4)).toList

      val posList: Map[EntityLivingBase, Vec3d] = entList.map(e => (e, new Vec3d(e.posX, e.posY, e.posZ))).toMap
      val speedList: List[Double] = posList.map(kvp => (kvp._2-prevEnts.getOrElse(kvp._1, kvp._2)).lengthVector()).toList.sortWith((d0, d1) => d0 > d1)

      val max: Double = speedList.headOption.getOrElse(0)
      postMax = postMax.tail :+ max

      var mean: Double = 0
      postMax foreach(d => mean += d/postMax.length)
      println(mean)
      powerLevel = (mean * 30).toInt
      println(powerLevel)

      prevEnts = posList

      this.getWorld.notifyNeighborsOfStateChange(this.getPos, this.getBlockType)
    }
  }

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.