feat: creativeNoInfinitePickup & skipTicksForJoblessVillager

This commit is contained in:
zly2006 committed 2024-07-11 12:14:01 +08:00
1 parent 4b58aabaa7
commit ddb8f3b400
9 files changed
+167 -8

No files matched your search

@@ -0,0 +1,38 @@
package com.github.zly2006.carpetslsaddition.mixin;
import net.minecraft.entity.player.PlayerAbilities;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(PlayerAbilities.class)
public interface AccessorPlayerAbilities {
@Accessor("flySpeed")
void setFlyingSpeed(float speed);
@Accessor("walkSpeed")
void setWalkingSpeed(float speed);
@Accessor("flying")
void setFlying(boolean flying);
@Accessor("invulnerable")
void setInvulnerable(boolean invulnerable);
@Accessor("allowFlying")
void setAllowFlying(boolean allowFlying);
@Accessor("creativeMode")
void setCreativeMode(boolean creativeMode);
@Accessor("allowModifyWorld")
void setAllowModifyWorld(boolean allowModifyWorld);
@Accessor("flySpeed")
float getFlyingSpeed();
@Accessor("walkSpeed")
float getWalkingSpeed();
@Accessor("flying")
boolean isFlying();
@Accessor("invulnerable")
boolean isInvulnerable();
@Accessor("allowFlying")
boolean isAllowFlying();
@Accessor("creativeMode")
boolean isCreativeMode();
@Accessor("allowModifyWorld")
boolean isAllowModifyWorld();
}
@@ -0,0 +1,35 @@
package com.github.zly2006.carpetslsaddition.mixin;
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
import net.minecraft.entity.player.PlayerAbilities;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(PlayerInventory.class)
public class MixinPlayerInventory {
@Redirect(method = "insertStack(ILnet/minecraft/item/ItemStack;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getAbilities()Lnet/minecraft/entity/player/PlayerAbilities;"))
private PlayerAbilities insertStack(PlayerEntity instance) {
if (SLSCarpetSettings.creativeNoInfinitePickup) {
AccessorPlayerAbilities accessor = (AccessorPlayerAbilities) instance.getAbilities();
PlayerAbilities abilities = new PlayerAbilities();
AccessorPlayerAbilities accessor1 = (AccessorPlayerAbilities) abilities;
accessor1.setCreativeMode(false);
accessor1.setFlying(accessor.isFlying());
accessor1.setFlyingSpeed(accessor.getFlyingSpeed());
accessor1.setInvulnerable(accessor.isInvulnerable());
accessor1.setAllowFlying(accessor.isAllowFlying());
accessor1.setAllowModifyWorld(accessor.isAllowModifyWorld());
accessor1.setWalkingSpeed(accessor.getWalkingSpeed());
return abilities;
}
return instance.getAbilities();
}
}
@@ -0,0 +1,50 @@
package com.github.zly2006.carpetslsaddition.mixin;
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.passive.MerchantEntity;
import net.minecraft.entity.passive.VillagerEntity;
import net.minecraft.village.VillagerData;
import net.minecraft.village.VillagerProfession;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(VillagerEntity.class)
public abstract class MixinVillagerEntity extends MerchantEntity {
@Shadow public abstract VillagerData getVillagerData();
@Shadow protected abstract void decayGossip();
int tickCount = 0;
public MixinVillagerEntity(EntityType<? extends MerchantEntity> entityType, World world) {
super(entityType, world);
}
@Inject(at = @At("HEAD"), method = "tick", cancellable = true)
private void onTick(CallbackInfo ci) {
if (SLSCarpetSettings.skipTicksForJoblessVillager != 0) {
VillagerProfession profession = this.getVillagerData().getProfession();
if (profession != VillagerProfession.NONE && profession != VillagerProfession.NITWIT) {
tickCount = 0;
return;
}
if (tickCount > 0) {
tickCount--;
}
else {
tickCount = SLSCarpetSettings.skipTicksForJoblessVillager + 1;
ci.cancel();
if (this.getHeadRollingTimeLeft() > 0) {
this.setHeadRollingTimeLeft(this.getHeadRollingTimeLeft() - 1);
}
this.decayGossip();
}
}
}
}