mod for the islanders smp

1.0.0-rc5 - fix special items being able to take damage - remove debug toggle - put /animation behind permission level 4 - restrict chorus fruits to 64 - prevent special item entities from despawning

+24 -10
+1 -1
gradle.properties
··· 10 10 fabric_kotlin_version=1.13.4+kotlin.2.2.0 11 11 12 12 # Mod Properties 13 - mod_version=1.0.0-rc4 13 + mod_version=1.0.0-rc5 14 14 maven_group=net.radsteve.islanders 15 15 archives_base_name=islanders-smp 16 16
+10
src/main/java/net/radsteve/islanders/mixin/ItemEntityMixin.java
··· 1 1 package net.radsteve.islanders.mixin; 2 2 3 3 import net.minecraft.entity.ItemEntity; 4 + import net.minecraft.entity.damage.DamageSource; 4 5 import net.minecraft.entity.player.PlayerEntity; 5 6 import net.minecraft.item.ItemStack; 6 7 import net.minecraft.server.network.ServerPlayerEntity; 8 + import net.minecraft.server.world.ServerWorld; 7 9 import net.radsteve.islanders.SpecialItem; 8 10 import net.radsteve.islanders.event.ItemPickupCallback; 9 11 import net.radsteve.islanders.event.ResizeItemEntityAndAddRemainingStackCallback; ··· 13 15 import org.spongepowered.asm.mixin.injection.At; 14 16 import org.spongepowered.asm.mixin.injection.Inject; 15 17 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 18 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 16 19 17 20 import java.util.UUID; 18 21 ··· 45 48 ResizeItemEntityAndAddRemainingStackCallback.Companion.getEVENT().invoker().resize((ItemEntity) (Object) this, (ServerPlayerEntity) player); 46 49 47 50 ci.cancel(); 51 + } 52 + 53 + @Inject(method = "damage", at = @At("HEAD"), cancellable = true) 54 + private void islanders$damage(ServerWorld world, DamageSource source, float amount, CallbackInfoReturnable<Boolean> cir) { 55 + if (SpecialItem.Companion.find(getStack()) != null) { 56 + cir.setReturnValue(false); 57 + } 48 58 } 49 59 }
+1
src/main/java/net/radsteve/islanders/mixin/LivingEntityMixin.java
··· 24 24 25 25 if (item != null) { 26 26 entity.setGlowing(true); 27 + entity.setNeverDespawn(); 27 28 entity.getWorld().getScoreboard().addScoreHolderToTeam(entity.getNameForScoreboard(), item.getTeam()); 28 29 } 29 30
+7
src/main/java/net/radsteve/islanders/mixin/PlayerEntityMixin.java
··· 2 2 3 3 import kotlin.Pair; 4 4 import net.minecraft.entity.LivingEntity; 5 + import net.minecraft.entity.damage.DamageSource; 6 + import net.minecraft.entity.damage.DamageTypes; 5 7 import net.minecraft.entity.player.PlayerEntity; 6 8 import net.minecraft.entity.player.PlayerInventory; 7 9 import net.minecraft.item.ItemStack; ··· 31 33 @Inject(method = "dropInventory", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerInventory;dropAll()V")) 32 34 private void islanders$dropInventory(ServerWorld world, CallbackInfo ci) { 33 35 final LivingEntity entity = (LivingEntity) (Object) this; 36 + final DamageSource recentDamageSource = entity.getRecentDamageSource(); 37 + 38 + if (recentDamageSource != null && entity.getRecentDamageSource().isOf(DamageTypes.OUT_OF_WORLD)) { 39 + return; 40 + } 34 41 35 42 if (entity.getPrimeAdversary() instanceof PlayerEntity) { 36 43 return;
+1 -4
src/main/kotlin/net/radsteve/islanders/Islanders.kt
··· 5 5 import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents 6 6 import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents 7 7 import net.mcbrawls.scheduler.AbsoluteScheduler 8 - import net.mcbrawls.scheduler.RelativeScheduler 9 8 import net.mcbrawls.scheduler.Scheduler 10 9 import net.minecraft.server.MinecraftServer 11 10 import net.radsteve.islanders.command.animationCommand ··· 26 25 logger.info("Initialising...") 27 26 28 27 CommandRegistrationCallback.EVENT.register { dispatcher, registryAccess, environment -> 29 - if (IslandersData.debug()) { 30 - animationCommand(dispatcher) 31 - } 28 + animationCommand(dispatcher) 32 29 } 33 30 34 31 ServerLifecycleEvents.SERVER_STARTED.register { server -> Islanders.server = server }
-4
src/main/kotlin/net/radsteve/islanders/IslandersData.kt
··· 15 15 dir.createDirectories() 16 16 } 17 17 18 - public fun debug(): Boolean { 19 - return dir.resolve("debug").exists() 20 - } 21 - 22 18 public fun obtainer(id: String): String? { 23 19 return dir.resolve("${id}_obtained") 24 20 .takeIf(Path::exists)
+1
src/main/kotlin/net/radsteve/islanders/command/AnimationCommand.kt
··· 10 10 public fun animationCommand(dispatcher: CommandDispatcher<ServerCommandSource>) { 11 11 dispatcher.register( 12 12 CommandManager.literal("animation") 13 + .requires { source -> source.hasPermissionLevel(4) } 13 14 .then( 14 15 CommandManager.literal("mace") 15 16 .executes { ctx ->
+1
src/main/kotlin/net/radsteve/islanders/crown/CrownAnimation.kt
··· 172 172 ) 173 173 val item = ItemEntity(world, startLocation!!.x, startLocation!!.y + 11, startLocation!!.z, CrownFactory.crown(), 0.0, -0.75, 0.0) 174 174 item.isGlowing = true 175 + item.setNeverDespawn() 175 176 world.scoreboard.addScoreHolderToTeam(item.nameForScoreboard, SpecialItem.Crown.team) 176 177 world.spawnEntity(item) 177 178 }
+2 -1
src/main/kotlin/net/radsteve/islanders/rule/DefaultRules.kt
··· 10 10 Items.ENDER_PEARL to 16, 11 11 Items.GOLDEN_APPLE to 64, 12 12 Items.TOTEM_OF_UNDYING to 1, 13 - Items.WIND_CHARGE to 64 13 + Items.WIND_CHARGE to 64, 14 + Items.CHORUS_FRUIT to 64, 14 15 ) 15 16 16 17 limits.forEach { (item, limit) ->