Skip to content

Commit

Permalink
Optimization and modification
Browse files Browse the repository at this point in the history
- Add natural spawning to the maid fairy
- Add substitute jizo item
- Add power point item
  • Loading branch information
TartaricAcid committed Oct 9, 2021
1 parent a2af392 commit 5a6b82e
Show file tree
Hide file tree
Showing 17 changed files with 241 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
import com.github.tartaricacid.touhoulittlemaid.entity.monster.EntityFairy;
import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid;
import com.github.tartaricacid.touhoulittlemaid.entity.projectile.EntityDanmaku;
import com.github.tartaricacid.touhoulittlemaid.entity.projectile.EntityThrowPowerPoint;
import com.github.tartaricacid.touhoulittlemaid.tileentity.TileEntityAltar;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.entity.SpriteRenderer;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.client.registry.ClientRegistry;
Expand All @@ -21,13 +24,15 @@
public final class InitEntitiesRender {
@SubscribeEvent
public static void clientSetup(FMLClientSetupEvent evt) {
ItemRenderer itemRenderer = evt.getMinecraftSupplier().get().getItemRenderer();
RenderingRegistry.registerEntityRenderingHandler(EntityMaid.TYPE, EntityMaidRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(EntityChair.TYPE, EntityChairRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(EntityFairy.TYPE, EntityFairyRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(EntityDanmaku.TYPE, EntityDanmakuRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(EntityPowerPoint.TYPE, EntityPowerPointRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(EntityExtinguishingAgent.TYPE, EntityExtinguishingAgentRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(EntityBox.TYPE, EntityBoxRender::new);
RenderingRegistry.registerEntityRenderingHandler(EntityThrowPowerPoint.TYPE, (manager) -> new SpriteRenderer<>(manager, itemRenderer));
ClientRegistry.bindTileEntityRenderer(TileEntityAltar.TYPE, TileEntityAltarRenderer::new);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import java.util.Objects;

public class EntityFairy extends MonsterEntity implements IRangedAttackMob, IFlyingAnimal, IHasPowerPoint {
public static final EntityType<EntityFairy> TYPE = EntityType.Builder.<EntityFairy>of(EntityFairy::new, EntityClassification.MISC)
public static final EntityType<EntityFairy> TYPE = EntityType.Builder.<EntityFairy>of(EntityFairy::new, EntityClassification.MONSTER)
.sized(0.6f, 1.5f).clientTrackingRange(10).build("fairy");

private static final String FAIRY_TYPE_TAG_NAME = "FairyType";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -637,14 +637,12 @@ private void randomRestoreHealth() {

private void spawnPortalParticle() {
if (this.level.isClientSide && this.isInvulnerable() && this.getOwner() != null) {
for (int i = 0; i < 2; ++i) {
this.level.addParticle(ParticleTypes.PORTAL,
this.getX() + (this.random.nextDouble() - 0.5D) * (double) this.getBbWidth(),
this.getY() + this.random.nextDouble() * (double) this.getBbHeight() - 0.25D,
this.getZ() + (this.random.nextDouble() - 0.5D) * (double) this.getBbWidth(),
(this.random.nextDouble() - 0.5D) * 2.0D, -this.random.nextDouble(),
(this.random.nextDouble() - 0.5D) * 2.0D);
}
this.level.addParticle(ParticleTypes.PORTAL,
this.getX() + (this.random.nextDouble() - 0.5D) * (double) this.getBbWidth(),
this.getY() + this.random.nextDouble() * (double) this.getBbHeight() - 0.25D,
this.getZ() + (this.random.nextDouble() - 0.5D) * (double) this.getBbWidth(),
(this.random.nextDouble() - 0.5D) * 2.0D, -this.random.nextDouble(),
(this.random.nextDouble() - 0.5D) * 2.0D);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.github.tartaricacid.touhoulittlemaid.entity.projectile;

import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityPowerPoint;
import com.github.tartaricacid.touhoulittlemaid.init.InitItems;
import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.projectile.ProjectileItemEntity;
import net.minecraft.item.Item;
import net.minecraft.network.IPacket;
import net.minecraft.potion.PotionUtils;
import net.minecraft.potion.Potions;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fml.network.NetworkHooks;

public class EntityThrowPowerPoint extends ProjectileItemEntity {
public static final EntityType<EntityThrowPowerPoint> TYPE = EntityType.Builder.<EntityThrowPowerPoint>of(EntityThrowPowerPoint::new, EntityClassification.MISC)
.sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(10).build("throw_power_point");

public EntityThrowPowerPoint(EntityType<EntityThrowPowerPoint> type, World worldIn) {
super(type, worldIn);
}

public EntityThrowPowerPoint(World world, LivingEntity thrower) {
super(TYPE, thrower, world);
}

public EntityThrowPowerPoint(World world, double x, double y, double z) {
super(TYPE, x, y, z, world);
}

@Override
protected Item getDefaultItem() {
return InitItems.POWER_POINT.get();
}

@Override
protected float getGravity() {
return 0.07F;
}

@Override
protected void onHit(RayTraceResult result) {
super.onHit(result);
if (!this.level.isClientSide) {
this.level.levelEvent(Constants.WorldEvents.POTION_IMPACT_INSTANT, this.blockPosition(), PotionUtils.getColor(Potions.HEALING));
int count = 30 + this.level.random.nextInt(30) + this.level.random.nextInt(30);
while (count > 0) {
int value = EntityPowerPoint.getPowerValue(count);
count -= value;
this.level.addFreshEntity(new EntityPowerPoint(this.level, this.getX(), this.getY(), this.getZ(), value));
}
this.remove();
}
}

@Override
public IPacket<?> getAddEntityPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@
import com.github.tartaricacid.touhoulittlemaid.entity.monster.EntityFairy;
import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid;
import com.github.tartaricacid.touhoulittlemaid.entity.projectile.EntityDanmaku;
import com.github.tartaricacid.touhoulittlemaid.entity.projectile.EntityThrowPowerPoint;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntitySpawnPlacementRegistry;
import net.minecraft.entity.EntitySpawnPlacementRegistry.PlacementType;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.ai.attributes.Attribute;
Expand All @@ -22,10 +25,12 @@
import net.minecraft.entity.ai.brain.sensor.SensorType;
import net.minecraft.entity.monster.MonsterEntity;
import net.minecraft.util.math.IPosWrapper;
import net.minecraft.world.gen.Heightmap.Type;
import net.minecraftforge.event.entity.EntityAttributeCreationEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.registries.DataSerializerEntry;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
Expand All @@ -49,6 +54,7 @@ public final class InitEntities {
public static RegistryObject<EntityType<EntityPowerPoint>> POWER_POINT = ENTITY_TYPES.register("power_point", () -> EntityPowerPoint.TYPE);
public static RegistryObject<EntityType<EntityExtinguishingAgent>> EXTINGUISHING_AGENT = ENTITY_TYPES.register("extinguishing_agent", () -> EntityExtinguishingAgent.TYPE);
public static RegistryObject<EntityType<EntityBox>> BOX = ENTITY_TYPES.register("box", () -> EntityBox.TYPE);
public static RegistryObject<EntityType<EntityThrowPowerPoint>> THROW_POWER_POINT = ENTITY_TYPES.register("throw_power_point", () -> EntityThrowPowerPoint.TYPE);

public static RegistryObject<MemoryModuleType<List<Entity>>> VISIBLE_PICKUP_ENTITIES = MEMORY_MODULE_TYPES.register("visible_pickup_entities", () -> new MemoryModuleType<>(Optional.empty()));
public static RegistryObject<MemoryModuleType<IPosWrapper>> TARGET_POS = MEMORY_MODULE_TYPES.register("target_pos", () -> new MemoryModuleType<>(Optional.empty()));
Expand Down Expand Up @@ -86,4 +92,9 @@ public static void addEntityAttributeEvent(EntityAttributeCreationEvent event) {
event.put(EntityChair.TYPE, LivingEntity.createLivingAttributes().build());
event.put(EntityFairy.TYPE, EntityFairy.createFairyAttributes().build());
}

@SubscribeEvent
public static void addEntitySpawnPlacement(FMLCommonSetupEvent event) {
EntitySpawnPlacementRegistry.register(InitEntities.FAIRY.get(), PlacementType.ON_GROUND, Type.MOTION_BLOCKING_NO_LEAVES, MonsterEntity::checkMonsterSpawnRules);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public final class InitItems {
public static RegistryObject<Item> ITEM_MAGNET_BAUBLE = ITEMS.register("item_magnet_bauble", ItemNormalBauble::new);
public static RegistryObject<Item> MUTE_BAUBLE = ITEMS.register("mute_bauble", ItemNormalBauble::new);
public static RegistryObject<Item> ENTITY_PLACEHOLDER = ITEMS.register("entity_placeholder", () -> new Item((new Item.Properties()).stacksTo(1)));
public static RegistryObject<Item> SUBSTITUTE_JIZO = ITEMS.register("substitute_jizo", ItemSubstituteJizo::new);
public static RegistryObject<Item> POWER_POINT = ITEMS.register("power_point", ItemPowerPoint::new);

public static RegistryObject<Item> MAID_SPAWN_EGG = ITEMS.register("maid_spawn_egg", () -> new SpawnEggItem(EntityMaid.TYPE, 0x4a6195, 0xffffff, (new Item.Properties()).tab(MAIN_TAB)));
public static RegistryObject<Item> FAIRY_SPAWN_EGG = ITEMS.register("fairy_spawn_egg", () -> new SpawnEggItem(EntityFairy.TYPE, 0x171c20, 0xffffff, (new Item.Properties()).tab(MAIN_TAB)));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.github.tartaricacid.touhoulittlemaid.init.registry;

import com.github.tartaricacid.touhoulittlemaid.init.InitEntities;
import net.minecraft.entity.EntityClassification;
import net.minecraft.world.biome.MobSpawnInfo;
import net.minecraftforge.event.world.BiomeLoadingEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber
public final class MobSpawnInfoRegistry {
@SubscribeEvent
public static void addMobSpawnInfo(BiomeLoadingEvent event) {
event.getSpawns().addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(InitEntities.FAIRY.get(), 70, 2, 6));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@
import com.github.tartaricacid.touhoulittlemaid.api.block.IMultiBlock;
import com.github.tartaricacid.touhoulittlemaid.block.multiblock.MultiBlockManager;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
import net.minecraft.block.BlockState;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.ai.attributes.Attribute;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.ai.attributes.Attributes;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.item.ShootableItem;
Expand All @@ -22,8 +29,14 @@
import static com.github.tartaricacid.touhoulittlemaid.item.MaidGroup.MAIN_TAB;

public class ItemHakureiGohei extends ShootableItem {
private final Multimap<Attribute, AttributeModifier> defaultModifiers;

public ItemHakureiGohei() {
super((new Properties()).tab(MAIN_TAB).durability(300).setNoRepair());
ImmutableMultimap.Builder<Attribute, AttributeModifier> builder = ImmutableMultimap.builder();
builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", 4, AttributeModifier.Operation.ADDITION));
builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Tool modifier", -2, AttributeModifier.Operation.ADDITION));
this.defaultModifiers = builder.build();
}

@Override
Expand Down Expand Up @@ -70,4 +83,15 @@ public ActionResultType useOn(ItemUseContext context) {
}
return super.useOn(context);
}

@Override
public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
stack.hurtAndBreak(2, attacker, e -> e.broadcastBreakEvent(EquipmentSlotType.MAINHAND));
return true;
}

@Override
public Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(EquipmentSlotType equipmentSlot) {
return equipmentSlot == EquipmentSlotType.MAINHAND ? this.defaultModifiers : super.getDefaultAttributeModifiers(equipmentSlot);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.github.tartaricacid.touhoulittlemaid.item;

import com.github.tartaricacid.touhoulittlemaid.entity.projectile.EntityThrowPowerPoint;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.stats.Stats;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.world.World;

import static com.github.tartaricacid.touhoulittlemaid.item.MaidGroup.MAIN_TAB;

public class ItemPowerPoint extends Item {
public ItemPowerPoint() {
super((new Properties()).tab(MAIN_TAB));
}

@Override
public ActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
ItemStack stack = player.getItemInHand(hand);
world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.EXPERIENCE_BOTTLE_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (random.nextFloat() * 0.4F + 0.8F));
if (!world.isClientSide) {
EntityThrowPowerPoint powerPoint = new EntityThrowPowerPoint(world, player);
powerPoint.setItem(stack);
powerPoint.shootFromRotation(player, player.xRot, player.yRot, -20.0F, 0.7F, 1.0F);
world.addFreshEntity(powerPoint);
}
player.awardStat(Stats.ITEM_USED.get(this));
if (!player.isCreative()) {
stack.shrink(1);
}
return ActionResult.sidedSuccess(stack, world.isClientSide());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.github.tartaricacid.touhoulittlemaid.item;

import com.github.tartaricacid.touhoulittlemaid.api.event.InteractMaidEvent;
import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;

import javax.annotation.Nullable;
import java.util.List;

import static com.github.tartaricacid.touhoulittlemaid.item.MaidGroup.MAIN_TAB;

public class ItemSubstituteJizo extends Item {
public ItemSubstituteJizo() {
super((new Properties()).tab(MAIN_TAB).stacksTo(1));
MinecraftForge.EVENT_BUS.register(this);
}

@SubscribeEvent
public void onEntityInteract(InteractMaidEvent event) {
EntityMaid maid = event.getMaid();
ItemStack stack = event.getStack();
PlayerEntity player = event.getPlayer();
if (maid.isOwnedBy(player) && stack.getItem() == this && !maid.getIsInvulnerable()) {
maid.setEntityInvulnerable(true);
stack.shrink(1);
event.setCanceled(true);
}
}

@Override
public boolean isFoil(ItemStack stack) {
return true;
}

@Override
@OnlyIn(Dist.CLIENT)
public void appendHoverText(ItemStack stack, @Nullable World worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) {
tooltip.add(new TranslationTextComponent("tooltips.touhou_little_maid.substitute_jizo.desc"));
}
}
4 changes: 4 additions & 0 deletions src/main/resources/assets/touhou_little_maid/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"entity.touhou_little_maid.fairy": "Maid Fairy",
"entity.touhou_little_maid.danmaku": "Danmaku",
"entity.touhou_little_maid.box": "Cake Box",
"entity.touhou_little_maid.throw_power_point": "Power Point",
"item_group.touhou_little_maid.main": "Touhou Little Maid: Main",
"item.touhou_little_maid.maid_spawn_egg": "Maid Spawn Egg",
"item.touhou_little_maid.fairy_spawn_egg": "Fairy Maid Spawn Egg",
Expand All @@ -25,6 +26,8 @@
"item.touhou_little_maid.item_magnet_bauble": "§6Item Magnet",
"item.touhou_little_maid.mute_bauble": "§6Mute Bauble",
"item.touhou_little_maid.entity_placeholder": "Spawn Entity",
"item.touhou_little_maid.substitute_jizo": "Substitute Jizo",
"item.touhou_little_maid.power_point": "Power Point",
"block.touhou_little_maid.maid_bed": "Maid Bed",
"tooltips.touhou_little_maid.chair.place.desc": "Right click on the top of the block to place it.",
"tooltips.touhou_little_maid.chair.destroy.desc": "Shift left hit can destroy it.",
Expand All @@ -37,6 +40,7 @@
"tooltips.touhou_little_maid.info.favorability": "Favorability",
"tooltips.touhou_little_maid.bauble.desc": "§a[Maid Bauble]",
"tooltips.touhou_little_maid.bauble.usage": "Need to be placed in the maid's bauble inventory",
"tooltips.touhou_little_maid.substitute_jizo.desc": "Right click on a maid to make it invulnerable, creative only",
"gui.touhou_little_maid.schedule.day": "Day Shift",
"gui.touhou_little_maid.schedule.night": "Night Shift",
"gui.touhou_little_maid.schedule.all": "All Day",
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/assets/touhou_little_maid/lang/zh_cn.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"entity.touhou_little_maid.fairy": "妖精女仆",
"entity.touhou_little_maid.danmaku": "弹幕",
"entity.touhou_little_maid.box": "蛋糕盒",
"entity.touhou_little_maid.throw_power_point": "P 点",
"item_group.touhou_little_maid.main": "车万女仆丨主体",
"item.touhou_little_maid.maid_spawn_egg": "女仆刷怪蛋",
"item.touhou_little_maid.fairy_spawn_egg": "女仆妖精刷怪蛋",
Expand All @@ -25,6 +26,8 @@
"item.touhou_little_maid.item_magnet_bauble": "§6物品磁铁",
"item.touhou_little_maid.mute_bauble": "§6禁言饰品",
"item.touhou_little_maid.entity_placeholder": "生成实体",
"item.touhou_little_maid.substitute_jizo": "替身地藏",
"item.touhou_little_maid.power_point": "P 点",
"block.touhou_little_maid.maid_bed": "女仆床",
"tooltips.touhou_little_maid.chair.place.desc": "右击方块顶部进行放置。",
"tooltips.touhou_little_maid.chair.destroy.desc": "Shift 左击破坏它。",
Expand All @@ -37,6 +40,7 @@
"tooltips.touhou_little_maid.info.favorability": "好感度",
"tooltips.touhou_little_maid.bauble.desc": "§a[女仆饰品]",
"tooltips.touhou_little_maid.bauble.usage": "需要放置在女仆的饰品栏中",
"tooltips.touhou_little_maid.substitute_jizo.desc": "右击女仆使其无敌,仅限创造模式",
"gui.touhou_little_maid.schedule.day": "白班",
"gui.touhou_little_maid.schedule.night": "夜班",
"gui.touhou_little_maid.schedule.all": "全天",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "touhou_little_maid:items/power_point"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "touhou_little_maid:items/substitute_jizo"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"replace": false,
"entries": [
"touhou_little_maid:power_point"
]
}

0 comments on commit 5a6b82e

Please sign in to comment.