From d6d6b69fcb6b940b068c330bc3e2f6a8ab73ddea Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 12 Apr 2020 19:42:04 -0300 Subject: [PATCH] added inhabited_time and player events revolving around damage, death and respawns. --- docs/scarpet/Full.md | 11 +++- docs/scarpet/api/BlocksAndWorldAccess.md | 4 ++ docs/scarpet/api/Events.md | 4 ++ docs/scarpet/resources/editors/idea/2.txt | 1 + docs/scarpet/resources/editors/idea/4.txt | 6 ++- .../scarpet/resources/editors/npp/scarpet.xml | 6 ++- .../DamageTracker_scarpetEventMixin.java | 14 +++++- .../PlayerManager_scarpetEventsMixin.java | 21 ++++++++ .../ServerPlayerEntity_scarpetEventMixin.java | 5 ++ .../java/carpet/script/CarpetEventServer.java | 50 +++++++++++++++++++ .../assets/carpet/scripts/event_test.sc | 35 +++++++++++++ src/main/resources/carpet.mixins.json | 1 + 12 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 src/main/java/carpet/mixins/PlayerManager_scarpetEventsMixin.java diff --git a/docs/scarpet/Full.md b/docs/scarpet/Full.md index 572c8123..baed6c5d 100644 --- a/docs/scarpet/Full.md +++ b/docs/scarpet/Full.md @@ -276,7 +276,8 @@ global_foo = floor(rand(10)); check_foo_not_zero(); ... check_foo_not_zero() -> if(global_foo == 0, global_foo = 1) -# Variables and Constants + +# Variables and Constants `scarpet` provides a number of constants that can be used literally in scripts @@ -2055,6 +2056,10 @@ Returns generation status as per the ticket system. Can return any value from se can only be stable in a few states: `full`, `features`, `liquid_carvers`, and `structure_starts`. Returns `null` if the chunk is not in memory unless called with optional `true`. +### `inhabited_time(pos)` + +Returns inhabited time for a chunk. + ### `structures(pos), structures(pos, structure_name)` Returns structure information for a given block position. Note that structure information is the same for all the @@ -2872,6 +2877,10 @@ __on_player_interacts_with_block(player, hand, block, face, hitvec) //right cli __on_player_places_block(player, item_tuple, hand, block) // player have just placed the block. __on_player_interacts_with_entity(player, entity, hand) __on_player_attacks_entity(player, entity) +__on_player_takes_damage(player, amount, source, source_entity) +__on_player_deals_damage(player, amount, entity) +__on_player_dies(player) +__on_player_respawns(player) __on_player_rides(player, forward, strafe, jumping, sneaking) __on_player_jumps(player) __on_player_deploys_elytra(player) diff --git a/docs/scarpet/api/BlocksAndWorldAccess.md b/docs/scarpet/api/BlocksAndWorldAccess.md index 7c31b2cd..1ec333d7 100644 --- a/docs/scarpet/api/BlocksAndWorldAccess.md +++ b/docs/scarpet/api/BlocksAndWorldAccess.md @@ -519,6 +519,10 @@ Returns generation status as per the ticket system. Can return any value from se can only be stable in a few states: `full`, `features`, `liquid_carvers`, and `structure_starts`. Returns `null` if the chunk is not in memory unless called with optional `true`. +### `inhabited_time(pos)` + +Returns inhabited time for a chunk. + ### `structures(pos), structures(pos, structure_name)` Returns structure information for a given block position. Note that structure information is the same for all the diff --git a/docs/scarpet/api/Events.md b/docs/scarpet/api/Events.md index aa9f1c98..6408ac94 100644 --- a/docs/scarpet/api/Events.md +++ b/docs/scarpet/api/Events.md @@ -33,6 +33,10 @@ __on_player_interacts_with_block(player, hand, block, face, hitvec) //right cli __on_player_places_block(player, item_tuple, hand, block) // player have just placed the block. __on_player_interacts_with_entity(player, entity, hand) __on_player_attacks_entity(player, entity) +__on_player_takes_damage(player, amount, source, source_entity) +__on_player_deals_damage(player, amount, entity) +__on_player_dies(player) +__on_player_respawns(player) __on_player_rides(player, forward, strafe, jumping, sneaking) __on_player_jumps(player) __on_player_deploys_elytra(player) diff --git a/docs/scarpet/resources/editors/idea/2.txt b/docs/scarpet/resources/editors/idea/2.txt index bbdf2f18..c98522d1 100644 --- a/docs/scarpet/resources/editors/idea/2.txt +++ b/docs/scarpet/resources/editors/idea/2.txt @@ -30,6 +30,7 @@ hardness harvest in_dimension in_slime_chunk +inhabited_time inventory_find inventory_get inventory_remove diff --git a/docs/scarpet/resources/editors/idea/4.txt b/docs/scarpet/resources/editors/idea/4.txt index 6c37a65a..6200e26c 100644 --- a/docs/scarpet/resources/editors/idea/4.txt +++ b/docs/scarpet/resources/editors/idea/4.txt @@ -25,4 +25,8 @@ __on_player_wakes_up __on_statistic __on_tick __on_tick_ender -__on_tick_nether \ No newline at end of file +__on_tick_nether +__on_player_takes_damage +__on_player_deals_damage +__on_player_dies +__on_player_respawns \ No newline at end of file diff --git a/docs/scarpet/resources/editors/npp/scarpet.xml b/docs/scarpet/resources/editors/npp/scarpet.xml index 332d1030..8c06f293 100644 --- a/docs/scarpet/resources/editors/npp/scarpet.xml +++ b/docs/scarpet/resources/editors/npp/scarpet.xml @@ -54,7 +54,7 @@ hardness blast_resistance top loaded suffocates power ticks_randomly update block_tick random_tick in_slime_chunk set without_updates blocks_movement block_sound material map_colour property block_properties block_data poi set_poi - place_item set_biome biome loaded_status generation_status chunk_tickets + place_item set_biome biome loaded_status generation_status inhabited_time chunk_tickets structures structure_references set_structure reset_chunk scoreboard scoreboard_add scoreboard_remove scoreboard_display @@ -104,6 +104,10 @@ __on_tick __on_tick_ender __on_tick_nether + __on_player_takes_damage + __on_player_deals_damage + __on_player_dies + __on_player_respawns $ 00' 01\ 02' 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 diff --git a/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java b/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java index 6f6a7d62..3ac352d9 100644 --- a/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java +++ b/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java @@ -5,6 +5,7 @@ import carpet.script.EntityEventsGroup; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.damage.DamageTracker; +import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -12,8 +13,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import static carpet.script.CarpetEventServer.Event.PLAYER_DEALS_DAMAGE; +import static carpet.script.CarpetEventServer.Event.PLAYER_TAKES_DAMAGE; + @Mixin(DamageTracker.class) -public class DamageTracker_scarpetEventMixin +public abstract class DamageTracker_scarpetEventMixin { @Shadow @Final private LivingEntity entity; @@ -21,5 +25,13 @@ public class DamageTracker_scarpetEventMixin private void onDamageTaken(DamageSource damageSource_1, float float_1, float float_2, CallbackInfo ci) { ((EntityInterface)entity).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DAMAGE, entity, float_2, damageSource_1); + if (entity instanceof ServerPlayerEntity && PLAYER_TAKES_DAMAGE.isNeeded()) + { + PLAYER_TAKES_DAMAGE.onDamage(entity, float_2, damageSource_1); + } + if (damageSource_1.getAttacker() instanceof ServerPlayerEntity && PLAYER_DEALS_DAMAGE.isNeeded()) + { + PLAYER_DEALS_DAMAGE.onDamage(entity, float_2, damageSource_1); + } } } diff --git a/src/main/java/carpet/mixins/PlayerManager_scarpetEventsMixin.java b/src/main/java/carpet/mixins/PlayerManager_scarpetEventsMixin.java new file mode 100644 index 00000000..9b03218d --- /dev/null +++ b/src/main/java/carpet/mixins/PlayerManager_scarpetEventsMixin.java @@ -0,0 +1,21 @@ +package carpet.mixins; + +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.dimension.DimensionType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import static carpet.script.CarpetEventServer.Event.PLAYER_RESPAWNS; + +@Mixin(PlayerManager.class) +public class PlayerManager_scarpetEventsMixin +{ + @Inject(method = "respawnPlayer", at = @At("HEAD")) + private void onRespawn(ServerPlayerEntity player, DimensionType dimension, boolean alive, CallbackInfoReturnable cir) + { + PLAYER_RESPAWNS.onPlayerEvent(player); + } +} diff --git a/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java b/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java index c5beb8da..17bbd74d 100644 --- a/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java +++ b/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java @@ -17,6 +17,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import static carpet.script.CarpetEventServer.Event.PLAYER_DIES; import static carpet.script.CarpetEventServer.Event.PLAYER_FINISHED_USING_ITEM; import static carpet.script.CarpetEventServer.Event.STATISTICS; @@ -61,6 +62,10 @@ public abstract class ServerPlayerEntity_scarpetEventMixin extends PlayerEntity private void onDeathEvent(DamageSource source, CallbackInfo ci) { ((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DEATH, this, source.name); + if (PLAYER_DIES.isNeeded()) + { + PLAYER_DIES.onPlayerEvent((ServerPlayerEntity) (Object)this); + } } @Redirect(method = "method_14218", at = @At( diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index e6c87413..447396c0 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -12,6 +12,7 @@ import carpet.script.value.StringValue; import carpet.script.value.Value; import carpet.utils.Messenger; import net.minecraft.block.BlockState; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.entity.Entity; import net.minecraft.server.network.ServerPlayerEntity; @@ -479,6 +480,53 @@ public class CarpetEventServer handler.call( () -> Collections.singletonList(((c, t) -> new EntityValue(player))), player::getCommandSource); } }, + PLAYER_TAKES_DAMAGE("player_takes_damage", 4, false) + { + @Override + public void onDamage(Entity target, float amount, DamageSource source) + { + handler.call( () -> + { + return Arrays.asList( + ((c, t) -> new EntityValue(target)), + ((c, t) -> new NumericValue(amount)), + ((c, t) ->new StringValue(source.getName())), + ((c, t) -> source.getAttacker()==null?Value.NULL:new EntityValue(source.getAttacker())) + ); + }, target::getCommandSource); + } + }, + PLAYER_DEALS_DAMAGE("player_deals_damage", 3, false) + { + @Override + public void onDamage(Entity target, float amount, DamageSource source) + { + handler.call( () -> + { + return Arrays.asList( + ((c, t) -> new EntityValue(source.getAttacker())), + ((c, t) -> new NumericValue(amount)), + ((c, t) -> new EntityValue(target)) + ); + }, () -> source.getAttacker().getCommandSource()); + } + }, + PLAYER_DIES("player_dies", 1, false) + { + @Override + public void onPlayerEvent(ServerPlayerEntity player) + { + handler.call( () -> Collections.singletonList(((c, t) -> new EntityValue(player))), player::getCommandSource); + } + }, + PLAYER_RESPAWNS("player_respawns", 1, false) + { + @Override + public void onPlayerEvent(ServerPlayerEntity player) + { + handler.call( () -> Collections.singletonList(((c, t) -> new EntityValue(player))), player::getCommandSource); + } + }, STATISTICS("statistic", 4, false) { private Identifier getStatId(Stat stat) @@ -551,6 +599,8 @@ public class CarpetEventServer public void onBlockBroken(ServerPlayerEntity player, BlockPos pos, BlockState previousBS) { } public void onBlockPlaced(ServerPlayerEntity player, BlockPos pos, Hand enumhand, ItemStack itemstack) { } public void onEntityAction(ServerPlayerEntity player, Entity entity, Hand enumhand) { } + public void onDamage(Entity target, float amount, DamageSource source) { } + public void onWorldEvent(ServerWorld world, BlockPos pos) { } public void onWorldEventFlag(ServerWorld world, BlockPos pos, int flag) { } } diff --git a/src/main/resources/assets/carpet/scripts/event_test.sc b/src/main/resources/assets/carpet/scripts/event_test.sc index 80e2346e..8e3d937a 100644 --- a/src/main/resources/assets/carpet/scripts/event_test.sc +++ b/src/main/resources/assets/carpet/scripts/event_test.sc @@ -185,3 +185,38 @@ __on_player_places_block(player, item_tuple, hand, block) -> print(' > count: '+count); print(' > nbt: '+nbt); ); + +__on_player_takes_damage(player, amount, source, entity) -> +( + print(''); + print('__on_player_takes_damage(player, amount, source, source_entity)'); + print('player takes damage:'); + print(' - player: '+player); + print(' - amount: '+str('%.2f',amount)); + print(' - source: '+source); + print(' - source_entity: '+entity); +); + +__on_player_deals_damage(player, amount, entity) -> +( + print(''); + print('__on_player_deals_damage(player, amount, target)'); + print('player deals damage:'); + print(' - player: '+player); + print(' - amount: '+str('%.2f',amount)); + print(' - target: '+entity); +); + +__on_player_dies(player) -> +( + print(''); + print('__on_player_dies(player)'); + print('Player '+player+' dies.') +); + +__on_player_respawns(player) -> +( + print(''); + print('__on_player_respawns(player)'); + print('Player '+player+' respawns.') +); diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 25c2356e..1fc02972 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -140,6 +140,7 @@ "ServerPlayerEntity_scarpetEventMixin", "FallingBlockEntity_scarpetEventsMixin", "BlockItem_scarpetEventMixin", + "PlayerManager_scarpetEventsMixin", "ChunkTicketManager_scarpetMixin", "ServerChunkManager_scarpetMixin",