Skip to content

Commit

Permalink
Merge pull request #3 from GameModsBR/rfc/helpers
Browse files Browse the repository at this point in the history
Request for Comment: New helper functions
  • Loading branch information
LoboMetalurgico authored Feb 5, 2024
2 parents 0180333 + 4e26b72 commit 6a0bea2
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package br.com.gamemods.minecity.core.helpers

import kotlin.reflect.KClass
import kotlin.reflect.full.isSubclassOf

/**
* Checks if an object **is** an instance of **ANY** of the classes given.
* @param types A list of [KClass] that will be checked.
*
* The following code examples are equivalent.
* ```kt
* obj is TypeA || obj is TypeB
* obj.isInstanceOfAny(TypeA::class, TypeB::class)
* ```
* @author alikindsys
*/
fun Any.isInstanceOfAny(vararg types: KClass<*>): Boolean {
// Short-circuiting on a list based on an OR operation.
for (cls in types) {
// ⊤ OR { ⊥,⊤ } = ⊤
// { ⊥,⊤ } OR ⊥ = { ⊥,⊤ }
if (this::class.isSubclassOf(cls)) return true
}
// ⊥ OR ⊥ = ⊥
return false
}

/**
* Checks if an object **is NOT** an instance of **ALL** the classes given.
* @param types A list of [KClass] that will be .
*
* The following code examples are equivalent.
* ```kt
* obj !is TypeA && obj !is TypeB
* obj.isInstanceOfNone(TypeA::class, TypeB::class)
* ```
* @author alikindsys
*/
fun Any.isInstanceOfNone(vararg types: KClass<*>): Boolean {
// !(P OR Q) = (!P AND !Q)
return !this.isInstanceOfAny(*types)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package br.com.gamemods.minecity.fabric.helpers

import br.com.gamemods.minecity.api.claim.Claim
import br.com.gamemods.minecity.api.id.ClaimPermissionId
import br.com.gamemods.minecity.api.serializer.UniqueId
import net.minecraft.util.ActionResult

/**
* Checks if a [UniqueId] has a given [ClaimPermissionId] inside a [Claim].
*
* *Note*: This is platform-dependent code since each loader treats [ActionResult]s differently.
* This code is **expected to work with Fabric API**'s event system.
* @param claim The claim being checked. Usually the one the player is located at.
* @param permissionId The [ClaimPermissionId] of the permission. E.g. [ClaimPermissionId.BUILD].
* @return An [ActionResult.PASS] if the player **has** the permission. An [ActionResult.FAIL] if the player **doesn't** have the permission.
* @see [ClaimPermissionId]
* @author alikindsys
*/
fun UniqueId.hasPermissionIn(claim: Claim, permissionId: ClaimPermissionId): ActionResult {
return if (claim.hasPermission(this, permissionId)) {
ActionResult.PASS
} else {
ActionResult.FAIL
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package br.com.gamemods.minecity.fabric.helpers

import net.minecraft.block.BlockState
import net.minecraft.block.entity.BlockEntity
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.world.World

/**
* Gets a [BlockState] from a [BlockHitResult] by accessing a [World]
*
* You *should* have a reference to a world on which this [BlockHitResult] was queried.
*
* **Trivial**: This is a mere convenience extension function.
* @param world The world being queried.
* @author alikindsys
*/
fun BlockHitResult.blockStateBy(world: World) : BlockState {
return world.getBlockState(this.blockPos)
}

/**
* Gets a [BlockEntity] from a [BlockHitResult] by accessing a [World]
*
* You *should* have a reference to a world on which this [BlockHitResult] was queried.
*
* **Trivial**: This is a mere convenience extension function.
* @param world The world being queried.
* @author alikindsys
*/
fun BlockHitResult.blockEntityBy(world: World) : BlockEntity? {
return world.getBlockEntity(this.blockPos)
}

0 comments on commit 6a0bea2

Please sign in to comment.