update drog effect
This commit is contained in:
@@ -1,10 +1,16 @@
|
||||
package dev.tggamesyt.szar.items;
|
||||
package dev.tggamesyt.szar;
|
||||
|
||||
import dev.tggamesyt.szar.Szar;
|
||||
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
|
||||
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.effect.StatusEffectInstance;
|
||||
import net.minecraft.entity.effect.StatusEffects;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.SpyglassItem;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.stat.Stats;
|
||||
import net.minecraft.util.Hand;
|
||||
@@ -15,9 +21,9 @@ import net.minecraft.world.World;
|
||||
public class Joint extends SpyglassItem {
|
||||
|
||||
public Joint(Settings settings) {
|
||||
super(settings.maxDamage(64)); // max durability
|
||||
super(settings.maxDamage(20)); // max durability
|
||||
}
|
||||
|
||||
private static final int COOLDOWN_TICKS = 20 * 5;
|
||||
@Override
|
||||
public UseAction getUseAction(ItemStack stack) {
|
||||
return UseAction.SPYGLASS; // keeps spyglass hold animation
|
||||
@@ -40,28 +46,90 @@ public class Joint extends SpyglassItem {
|
||||
@Override
|
||||
public void onStoppedUsing(ItemStack stack, World world, LivingEntity user, int remainingUseTicks) {
|
||||
// Only do server/client side durability and effect
|
||||
if (!world.isClient) return;
|
||||
//if (!world.isClient) return;
|
||||
|
||||
// Consume 1 durability
|
||||
stack.damage(1, user, p -> p.sendToolBreakStatus(user.getActiveHand()));
|
||||
|
||||
if (user instanceof PlayerEntity player && !world.isClient) {
|
||||
player.getItemCooldownManager().set(this, COOLDOWN_TICKS);
|
||||
}
|
||||
// Increase drug effect
|
||||
int amplifier = 0;
|
||||
if (user.hasStatusEffect(Szar.DROG_EFFECT)) {
|
||||
amplifier = Math.min(user.getStatusEffect(Szar.DROG_EFFECT).getAmplifier() + 1, 9); // max 10 levels
|
||||
user.addStatusEffect(new StatusEffectInstance(
|
||||
StatusEffects.LUCK,
|
||||
1200,
|
||||
amplifier,
|
||||
false, // ambient
|
||||
true, // show particles
|
||||
true // show icon
|
||||
));
|
||||
user.addStatusEffect(new StatusEffectInstance(
|
||||
StatusEffects.MINING_FATIGUE,
|
||||
1200,
|
||||
amplifier,
|
||||
false, // ambient
|
||||
true, // show particles
|
||||
true // show icon
|
||||
));
|
||||
user.addStatusEffect(new StatusEffectInstance(
|
||||
StatusEffects.STRENGTH,
|
||||
1200,
|
||||
amplifier,
|
||||
false, // ambient
|
||||
true, // show particles
|
||||
true // show icon
|
||||
));
|
||||
user.addStatusEffect(new StatusEffectInstance(
|
||||
StatusEffects.HEALTH_BOOST,
|
||||
1200,
|
||||
amplifier,
|
||||
false, // ambient
|
||||
true, // show particles
|
||||
true // show icon
|
||||
));
|
||||
user.addStatusEffect(new StatusEffectInstance(
|
||||
StatusEffects.REGENERATION,
|
||||
1200,
|
||||
amplifier,
|
||||
false, // ambient
|
||||
true, // show particles
|
||||
true // show icon
|
||||
));
|
||||
user.addStatusEffect(new StatusEffectInstance(
|
||||
StatusEffects.SATURATION,
|
||||
1200,
|
||||
amplifier,
|
||||
false, // ambient
|
||||
true, // show particles
|
||||
true // show icon
|
||||
));
|
||||
}
|
||||
if (amplifier > 3) {
|
||||
int nausealevel = amplifier - 3;
|
||||
user.addStatusEffect(new StatusEffectInstance(
|
||||
StatusEffects.NAUSEA,
|
||||
1200,
|
||||
nausealevel,
|
||||
false, // ambient
|
||||
true, // show particles
|
||||
true // show icon
|
||||
));
|
||||
}
|
||||
|
||||
// Apply the effect (10 seconds, invisible particles)
|
||||
user.addStatusEffect(new net.minecraft.entity.effect.StatusEffectInstance(
|
||||
user.addStatusEffect(new StatusEffectInstance(
|
||||
Szar.DROG_EFFECT,
|
||||
6000,
|
||||
1200,
|
||||
amplifier,
|
||||
false, // ambient
|
||||
false, // show particles
|
||||
true, // show particles
|
||||
true // show icon
|
||||
));
|
||||
|
||||
// Optional: play inhale / stop sound
|
||||
user.playSound(SoundEvents.ITEM_HONEY_BOTTLE_DRINK, 1.0F, 1.0F);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class NwordPassItem extends Item {
|
||||
PacketByteBuf buf = PacketByteBufs.create();
|
||||
buf.writeItemStack(stack);
|
||||
|
||||
ServerPlayNetworking.send(serverPlayer, Szar.NWORDPACKET, buf);
|
||||
ServerPlayNetworking.send(serverPlayer, Szar.TOTEMPACKET, buf);
|
||||
}
|
||||
//world.sendEntityStatus(user, (byte) 35);
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package dev.tggamesyt.szar;
|
||||
|
||||
import dev.tggamesyt.szar.items.Joint;
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
|
||||
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
|
||||
import net.fabricmc.fabric.api.message.v1.ServerMessageDecoratorEvent;
|
||||
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
|
||||
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder;
|
||||
@@ -17,13 +19,19 @@ import net.minecraft.entity.EntityDimensions;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.SpawnGroup;
|
||||
import net.minecraft.entity.effect.StatusEffect;
|
||||
import net.minecraft.entity.effect.StatusEffectInstance;
|
||||
import net.minecraft.entity.effect.StatusEffects;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.*;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.registry.Registries;
|
||||
import net.minecraft.registry.Registry;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Formatting;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
@@ -39,7 +47,7 @@ public class Szar implements ModInitializer {
|
||||
new Block(AbstractBlock.Settings.copy(Blocks.NETHERITE_BLOCK));
|
||||
public static final Block FASZ_BLOCK =
|
||||
new FaszBlock();
|
||||
public static final Identifier NWORDPACKET =
|
||||
public static final Identifier TOTEMPACKET =
|
||||
new Identifier(MOD_ID, "nwordpacket");
|
||||
public static final ItemGroup SZAR_GROUP = Registry.register(
|
||||
Registries.ITEM_GROUP,
|
||||
@@ -104,6 +112,13 @@ public class Szar implements ModInitializer {
|
||||
GYPSY_ENTITY_TYPE,
|
||||
GypsyEntity.createAttributes()
|
||||
);
|
||||
ServerTickEvents.END_WORLD_TICK.register(world -> {
|
||||
for (var entity : world.getPlayers()) {
|
||||
if (entity.getHealth() <= 0f) {
|
||||
tryDrugTotem(entity);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
public static final StatusEffect DROG_EFFECT = Registry.register(
|
||||
Registries.STATUS_EFFECT,
|
||||
@@ -344,6 +359,50 @@ public class Szar implements ModInitializer {
|
||||
.getProgress(advancement)
|
||||
.isDone();
|
||||
}
|
||||
public static boolean tryDrugTotem(PlayerEntity player) {
|
||||
StatusEffectInstance effect = player.getStatusEffect(Szar.DROG_EFFECT);
|
||||
if (effect == null || effect.getAmplifier() < 5) return false;
|
||||
|
||||
// Only trigger if holding Joint
|
||||
ItemStack stack = player.getMainHandStack();
|
||||
if (!(stack.getItem() instanceof Joint)) return false;
|
||||
|
||||
World world = player.getWorld();
|
||||
|
||||
// Prevent death
|
||||
player.setHealth(1f);
|
||||
|
||||
// Clear negative effects
|
||||
player.clearStatusEffects();
|
||||
|
||||
// Vanilla totem effects
|
||||
player.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 900, 1));
|
||||
player.addStatusEffect(new StatusEffectInstance(StatusEffects.ABSORPTION, 100, 1));
|
||||
player.addStatusEffect(new StatusEffectInstance(StatusEffects.FIRE_RESISTANCE, 800, 0));
|
||||
|
||||
// Sound
|
||||
player.playSound(SoundEvents.ITEM_TOTEM_USE, 1f, 1f);
|
||||
|
||||
// Animation via packet
|
||||
if (!world.isClient() && player instanceof ServerPlayerEntity serverPlayer) {
|
||||
PacketByteBuf buf = PacketByteBufs.create();
|
||||
buf.writeItemStack(stack);
|
||||
ServerPlayNetworking.send(serverPlayer, Szar.TOTEMPACKET, buf);
|
||||
}
|
||||
|
||||
// Reduce drug level safely
|
||||
int duration = effect.getDuration();
|
||||
int amplifier = effect.getAmplifier();
|
||||
player.addStatusEffect(new StatusEffectInstance(
|
||||
Szar.DROG_EFFECT,
|
||||
duration,
|
||||
Math.max(0, amplifier - 2),
|
||||
false,
|
||||
true,
|
||||
true
|
||||
));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user