Merge branch 'master' into 1.16

This commit is contained in:
gnembon committed 2020-04-29 11:41:10 -03:00
commit 95a7420e7d
8 files changed
+178 -25

No files matched your search

+31 -2
View File
@@ -2661,7 +2661,7 @@ Adds a vector to the motion vector. Most realistic way to apply a force to an en
### `modify(e, 'age', number)` ### `modify(e, 'age', number)`
Modifies entity's internal age counter. Fiddling with this will affect directly behaviours of complex Modifies entity's internal age counter. Fiddling with this will affect directly AI behaviours of complex
entities, so use it with caution. entities, so use it with caution.
### `modify(e, 'pickup_delay', number)` ### `modify(e, 'pickup_delay', number)`
@@ -2719,6 +2719,35 @@ and `true`. If no duration is specified, or it is null or 0, the effect is remov
Sets AI to stay around the home position, within `distance` blocks from it. `distance` defaults to 16 blocks. Sets AI to stay around the home position, within `distance` blocks from it. `distance` defaults to 16 blocks.
`null` removes it. _May_ not work fully with mobs that have this AI built in, like Villagers. `null` removes it. _May_ not work fully with mobs that have this AI built in, like Villagers.
### `modify(e, 'gamemode', gamemode?), modify(e, 'gamemode',gamemode_id?)`
Modifies gamemode of player to whatever string (case-insensitive) or number you put in.
* 0: survival
* 1: creative
* 2: adventure
* 3: spectator
### `modify(e, 'jumping', true/false)`
Will make the entity constantly jump if set to true, and will stop the entity from jumping if set to false.
Note that jumping parameter can be fully controlled by the entity AI, so don't expect that this will have
a permanent effect. Use `'jump'` to make an entity jump once for sure.
Requires a living entity as an argument.
### `modify(e, 'jump'))`
Will make the entity jump once.
### `modify(e, 'silent', true/false)`
### `modify(e, 'gravity', true/false)`
### `modify(e, 'fire', ticks)`
Will set mob on fire for `ticks` ticks. Set to 0 to extinguish.
## Entity Events ## Entity Events
There is a number of events that happen to entities that you can attach your own code to in the form of event handlers. There is a number of events that happen to entities that you can attach your own code to in the form of event handlers.
@@ -3062,7 +3091,7 @@ And colors:
* `e` - grEEn * `e` - grEEn
* `v` - naVy blue * `v` - naVy blue
* `k` - blaK * `k` - blaK
* `#FFAACC` - arbitrary RGB color (1.16+), hex notation * `#FFAACC` - arbitrary RGB color (1.16+), hex notation. Use uppercase for A-F symbols
Decorators (listed as extra argument after the component they would affect): Decorators (listed as extra argument after the component they would affect):
* `'^<format> <text>'` - hover over tooltip text, appearing when hovering with your mouse over the text below. * `'^<format> <text>'` - hover over tooltip text, appearing when hovering with your mouse over the text below.
+30 -1
View File
@@ -400,7 +400,7 @@ Adds a vector to the motion vector. Most realistic way to apply a force to an en
### `modify(e, 'age', number)` ### `modify(e, 'age', number)`
Modifies entity's internal age counter. Fiddling with this will affect directly behaviours of complex Modifies entity's internal age counter. Fiddling with this will affect directly AI behaviours of complex
entities, so use it with caution. entities, so use it with caution.
### `modify(e, 'pickup_delay', number)` ### `modify(e, 'pickup_delay', number)`
@@ -458,6 +458,35 @@ and `true`. If no duration is specified, or it is null or 0, the effect is remov
Sets AI to stay around the home position, within `distance` blocks from it. `distance` defaults to 16 blocks. Sets AI to stay around the home position, within `distance` blocks from it. `distance` defaults to 16 blocks.
`null` removes it. _May_ not work fully with mobs that have this AI built in, like Villagers. `null` removes it. _May_ not work fully with mobs that have this AI built in, like Villagers.
### `modify(e, 'gamemode', gamemode?), modify(e, 'gamemode',gamemode_id?)`
Modifies gamemode of player to whatever string (case-insensitive) or number you put in.
* 0: survival
* 1: creative
* 2: adventure
* 3: spectator
### `modify(e, 'jumping', true/false)`
Will make the entity constantly jump if set to true, and will stop the entity from jumping if set to false.
Note that jumping parameter can be fully controlled by the entity AI, so don't expect that this will have
a permanent effect. Use `'jump'` to make an entity jump once for sure.
Requires a living entity as an argument.
### `modify(e, 'jump'))`
Will make the entity jump once.
### `modify(e, 'silent', true/false)`
### `modify(e, 'gravity', true/false)`
### `modify(e, 'fire', ticks)`
Will set mob on fire for `ticks` ticks. Set to 0 to extinguish.
## Entity Events ## Entity Events
There is a number of events that happen to entities that you can attach your own code to in the form of event handlers. There is a number of events that happen to entities that you can attach your own code to in the form of event handlers.
@@ -25,6 +25,7 @@ entity_list
entity_selector entity_selector
escape_nbt escape_nbt
flammable flammable
format
game_tick game_tick
generation_status generation_status
hardness hardness
@@ -65,7 +65,7 @@
scan volume neighbours rect diamond scan volume neighbours rect diamond
logger sound particle particle_line particle_rect format logger sound particle particle_line particle_rect
run save tick_time world_time day_time last_tick_times game_tick seed current_dimension in_dimension run save tick_time world_time day_time last_tick_times game_tick seed current_dimension in_dimension
@@ -0,0 +1,7 @@
package carpet.fakes;
public interface LivingEntityInterface
{
void doJumpCM(); // added CM suffix to remove potential collisions with other mods
boolean isJumpingCM();
}
@@ -1,6 +1,7 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.EntityInterface; import carpet.fakes.EntityInterface;
import carpet.fakes.LivingEntityInterface;
import carpet.script.EntityEventsGroup; import carpet.script.EntityEventsGroup;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
@@ -8,14 +9,19 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.damage.DamageSource;
import net.minecraft.world.World; import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin; 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.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(LivingEntity.class) @Mixin(LivingEntity.class)
public abstract class LivingEntity_scarpetEventsMixin extends Entity public abstract class LivingEntity_scarpetEventsMixin extends Entity implements LivingEntityInterface
{ {
@Shadow protected abstract void jump();
@Shadow protected boolean jumping;
public LivingEntity_scarpetEventsMixin(EntityType<?> type, World world) public LivingEntity_scarpetEventsMixin(EntityType<?> type, World world)
{ {
super(type, world); super(type, world);
@@ -26,4 +32,16 @@ public abstract class LivingEntity_scarpetEventsMixin extends Entity
{ {
((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DEATH, this, damageSource_1.name); ((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DEATH, this, damageSource_1.name);
} }
@Override
public void doJumpCM()
{
jump();
}
@Override
public boolean isJumpingCM()
{
return jumping;
}
} }
@@ -2,6 +2,7 @@ package carpet.script.value;
import carpet.fakes.EntityInterface; import carpet.fakes.EntityInterface;
import carpet.fakes.ItemEntityInterface; import carpet.fakes.ItemEntityInterface;
import carpet.fakes.LivingEntityInterface;
import carpet.fakes.MobEntityInterface; import carpet.fakes.MobEntityInterface;
import carpet.helpers.Tracer; import carpet.helpers.Tracer;
import carpet.patches.EntityPlayerMPFake; import carpet.patches.EntityPlayerMPFake;
@@ -45,6 +46,7 @@ import net.minecraft.util.math.Direction;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.GameMode;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList; import java.util.ArrayList;
@@ -60,6 +62,7 @@ import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static carpet.script.value.NBTSerializableValue.nameFromRegistryId; import static carpet.script.value.NBTSerializableValue.nameFromRegistryId;
import static carpet.utils.MobAI.genericJump;
// TODO: decide whether copy(entity) should duplicate entity in the world. // TODO: decide whether copy(entity) should duplicate entity in the world.
public class EntityValue extends Value public class EntityValue extends Value
@@ -279,13 +282,13 @@ public class EntityValue extends Value
put("sneaking", (e, a) -> e.isSneaking()?Value.TRUE:Value.FALSE); put("sneaking", (e, a) -> e.isSneaking()?Value.TRUE:Value.FALSE);
put("sprinting", (e, a) -> e.isSprinting()?Value.TRUE:Value.FALSE); put("sprinting", (e, a) -> e.isSprinting()?Value.TRUE:Value.FALSE);
put("swimming", (e, a) -> e.isSwimming()?Value.TRUE:Value.FALSE); put("swimming", (e, a) -> e.isSwimming()?Value.TRUE:Value.FALSE);
/*put("jumping", (e, a) -> { put("jumping", (e, a) -> {
if (e instanceof LivingEntity) if (e instanceof LivingEntity)
{ {
return ((LivingEntity) e).getJumping()?Value.TRUE:Value.FALSE; return ((LivingEntityInterface) e).isJumpingCM()?Value.TRUE:Value.FALSE;
} }
return Value.NULL; return Value.NULL;
});*/ //needs mixing });
put("gamemode", (e, a) -> { put("gamemode", (e, a) -> {
if (e instanceof ServerPlayerEntity) if (e instanceof ServerPlayerEntity)
{ {
@@ -374,6 +377,7 @@ public class EntityValue extends Value
StatusEffectInstance pe = ((LivingEntity) e).getStatusEffect(potion); StatusEffectInstance pe = ((LivingEntity) e).getStatusEffect(potion);
return ListValue.of( new NumericValue(pe.getAmplifier()), new NumericValue(pe.getDuration()) ); return ListValue.of( new NumericValue(pe.getAmplifier()), new NumericValue(pe.getDuration()) );
}); });
put("health", (e, a) -> put("health", (e, a) ->
{ {
if (e instanceof LivingEntity) if (e instanceof LivingEntity)
@@ -529,8 +533,6 @@ public class EntityValue extends Value
//((ServerWorld)e.getEntityWorld()).method_14178().sendToNearbyPlayers(e, new EntityVelocityUpdateS2CPacket(e)); //((ServerWorld)e.getEntityWorld()).method_14178().sendToNearbyPlayers(e, new EntityVelocityUpdateS2CPacket(e));
} }
private static final Map<String, BiConsumer<Entity, Value>> featureModifiers = new HashMap<String, BiConsumer<Entity, Value>>() {{ private static final Map<String, BiConsumer<Entity, Value>> featureModifiers = new HashMap<String, BiConsumer<Entity, Value>>() {{
put("remove", (entity, value) -> entity.remove()); put("remove", (entity, value) -> entity.remove());
put("age", (e, v) -> e.age = Math.abs((int)NumericValue.asNumber(v).getLong()) ); put("age", (e, v) -> e.age = Math.abs((int)NumericValue.asNumber(v).getLong()) );
@@ -893,21 +895,61 @@ public class EntityValue extends Value
throw new InternalExpressionException("'effect' needs either no arguments (clear) or effect name, duration, and optional amplifier, show particles and show icon"); throw new InternalExpressionException("'effect' needs either no arguments (clear) or effect name, duration, and optional amplifier, show particles and show icon");
}); });
// gamemode put("gamemode", (e,v)->{
// spectate if(!(e instanceof ServerPlayerEntity)) return;
// "fire" GameMode toSet = v instanceof NumericValue ?
// "extinguish" GameMode.byId(((NumericValue) v).getInt(), null) :
// "silent" GameMode.byName(v.getString().toLowerCase(Locale.ROOT), null);
// "gravity" if (toSet != null) ((ServerPlayerEntity) e).setGameMode(toSet);
// "invulnerable" });
// "dimension"
// "item" put("jumping",(e,v)->{
// "count", if(!(e instanceof LivingEntity)) return;
// "age", ((LivingEntity) e).setJumping(v.getBoolean());
// "effect_"name });
// "hold"
// "hold_offhand" put("jump",(e,v)->{
// "jump" if (e instanceof LivingEntity)
{
((LivingEntityInterface)e).doJumpCM();
}
else
{
genericJump(e);
}
});
put("silent",(e,v)->{
e.setSilent(v.getBoolean());
});
put("gravity",(e,v)->{
e.setNoGravity(!v.getBoolean());
});
put("invulnerable",(e,v)->{
e.setInvulnerable(v.getBoolean());
});
put("fire",(e,v)->{
e.setFireTicks((int)NumericValue.asNumber(v).getLong());
});
// gamemode [check]
// spectate [check]
// "fire" [check]
// "extinguish" [set fire ticks to 0]
// "silent" [check]
// "gravity" [check]
// "invulnerable" [check]
// "dimension" []
// "item" []
// "count", []
// "age", [check]
// "effect_"name []
// "hold" [inventory_set?]
// "hold_offhand" [inventory_set?]
// "jump" [check]
// "nbt" <-big one, for now use run('data merge entity ... // "nbt" <-big one, for now use run('data merge entity ...
}}; }};
+27
View File
@@ -4,7 +4,13 @@ import carpet.CarpetServer;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.tag.FluidTags;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import java.util.HashMap; import java.util.HashMap;
@@ -93,4 +99,25 @@ public class MobAI
} }
} }
/**
* Not a replacement for living entity jump() - this barely is to allow other entities that can't jump in vanilla to 'jump'
* @param e
*/
public static void genericJump(Entity e)
{
if (!e.onGround && !e.isInFluid(FluidTags.WATER) && !e.isInLava()) return;
float m = e.world.getBlockState(new BlockPos(e)).getBlock().getJumpVelocityMultiplier();
float g = e.world.getBlockState(new BlockPos(e.getX(), e.getBoundingBox().y1 - 0.5000001D, e.getZ())).getBlock().getJumpVelocityMultiplier();
float jumpVelocityMultiplier = (double) m == 1.0D ? g : m;
float jumpStrength = (0.42F * jumpVelocityMultiplier);
Vec3d vec3d = e.getVelocity();
e.setVelocity(vec3d.x, jumpStrength, vec3d.z);
if (e.isSprinting())
{
float u = e.yaw * 0.017453292F;
e.setVelocity(e.getVelocity().add((-MathHelper.sin(g) * 0.2F), 0.0D, (MathHelper.cos(u) * 0.2F)));
}
e.velocityDirty = true;
}
} }