Compare commits

...
Author SHA1 Message Date
Marlo Greisser 9f42531f37 Solegnolia applies to dislocators (#114) 2026-10-04 16:00:00 +02:00
boubou19andUltraProdigy 95453b430e avoid global resource refresh when downloading the missing assets (#111)
Co-authored-by: UltraProdigy <187078471+UltraProdigy@users.noreply.github.com>
2026-08-17 05:59:32 +00:00
boubou19andgithub-actions[bot] 3635266bd5 Cache enum .values() (#109)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-10 21:05:47 +02:00
boubou19 fedee1ba43 Reduce render load of DE placed items (#108) 2026-08-08 23:26:18 +02:00
Jason Mitchell 6f183b615e Move the bindTexture out of the display list (#107) 2026-07-16 11:14:38 -05:00
__felix__ 15b257d120 Add NHLib dep to @Mod (#104) 2026-07-10 07:19:34 +02:00
ABKQPO 4ead9f53fb fix shield hud and bow matching rules (#102) 2026-07-06 18:28:03 +02:00
Algent 305e09ae4f Add API to get nearby ChaosIsland coordinate (#103) 2026-06-08 16:06:52 +02:00
Alexdoru 9009b1372a prevent dedicated server crash (#100) 2026-05-05 03:51:45 -04:00
31 changed files with 429 additions and 99 deletions

No files matched your search

+2
View File
@@ -10,6 +10,7 @@ dependencies {
compileOnly("com.github.GTNewHorizons:CodeChickenCore:1.4.12:dev") {transitive = false}
compileOnly("com.github.GTNewHorizons:inventory-tweaks:1.7.1:dev") {transitive = false}
compileOnly('com.github.GTNewHorizons:Baubles-Expanded:2.2.11-GTNH:dev') {transitive = false}
compileOnly("com.github.GTNewHorizons:Botania:1.13.36-GTNH:dev") {transitive = false}
compileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.461:dev") {transitive = false}
compileOnly("com.github.GTNewHorizons:Backhand:1.8.8:dev") {transitive = false}
@@ -18,4 +19,5 @@ dependencies {
compileOnly('curse.maven:automagy-222153:2285272')
compileOnly('com.github.GTNewHorizons:EnderIO:2.10.25:dev')
runtimeOnly("com.github.GTNewHorizons:NotEnoughItems:2.8.118-GTNH:dev")
}
+5
View File
@@ -186,6 +186,11 @@ modrinthRelations =
# Leave this empty if you don't want to publish on CurseForge.
curseForgeProjectId =
# Comma-separated supported CurseForge environments: client, server (case-insensitive).
# Use client or server for mods that only support one environment. Defaults to client,server.
# These tags describe where the mod can run, not whether installation is required on both sides.
curseForgeEnvironments = client,server
# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge.
# Syntax: type1:name1;type2:name2;...
# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible],
+10 -10
View File
@@ -1,12 +1,12 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/c2dd35c9d0aaf0ba6ad0791320f99dfc/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/e5810bd7fd1f8a586644409d395a7e55/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/7b3c4877c0749019e6805bb61e421497/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/8e1d9ee5d0f13e442218f6884a306da1/redirect
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/539ea72837c6244075f8ee037babc29e/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/876dbbf00bf4ef6190f7da074cee903a/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/539ea72837c6244075f8ee037babc29e/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/876dbbf00bf4ef6190f7da074cee903a/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9064f22734b42ac03e85df04b632e167/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/4d0277c49991306ac78048580fe34bcf/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/539ea72837c6244075f8ee037babc29e/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/876dbbf00bf4ef6190f7da074cee903a/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/a9fa3b809e484a1e1ac4308a5dda661a/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/aa99913fa6d767d899ffc96082da01ca/redirect
toolchainVersion=25
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
+1 -1
View File
@@ -17,7 +17,7 @@ pluginManagement {
}
plugins {
id 'com.gtnewhorizons.gtnhsettingsconvention' version '2.0.24'
id 'com.gtnewhorizons.gtnhsettingsconvention' version '2.0.34'
}
@@ -26,7 +26,9 @@ import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
version = References.VERSION,
canBeDeactivated = false,
guiFactory = References.GUIFACTORY,
dependencies = "after:NotEnoughItems;" + "after:ThermalExpansion;" + "after:ThermalFoundation;")
dependencies = "after:NotEnoughItems;" + "after:ThermalExpansion;"
+ "after:ThermalFoundation;"
+ "required-after:gtnhlib@[0.9.47,);")
public class DraconicEvolution {
@Mod.Instance(References.MODID)
@@ -2,8 +2,12 @@ package com.brandon3055.draconicevolution.api;
import java.util.Random;
import javax.annotation.Nullable;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import com.brandon3055.draconicevolution.common.handler.ConfigHandler;
import com.brandon3055.draconicevolution.common.utils.DataUtils;
import com.brandon3055.draconicevolution.common.world.ChaosWorldGenHandler;
import com.brandon3055.draconicevolution.common.world.DraconicWorldGenerator;
@@ -67,4 +71,25 @@ public class GeneratorOverride {
public static void setOreEnabledInEnd(boolean cometsEnabled) {
DraconicWorldGenerator.oreEnabledInEnd = cometsEnabled;
}
/**
* Returns coordinates of the nearest chaos island for the given chunk, or {@code null}
* <p>
* This is for mods who need to know where chaos islands generate, for example to avoid overlapping their own world
* features.
*
* @param chunkX chunk X position
* @param chunkZ chunk Z position
* @return Chaos Island Center coordinates, or {@code null} if none generates for that cell
*/
public static @Nullable ChunkCoordinates getNearestChaosIslandCenter(int chunkX, int chunkZ) {
if (!DraconicWorldGenerator.chaosIslandsEnabled || !ConfigHandler.generateChaosIslands) return null;
DataUtils.XZPair<Integer, Integer> center = ChaosWorldGenHandler.getClosestChaosSpawn(chunkX, chunkZ);
// tHe island in (0, 0) is never generated
if (center.x == 0 && center.z == 0) return null;
return new ChunkCoordinates(center.x, 80, center.z);
}
}
@@ -393,6 +393,7 @@ public final class ClientProxy extends CommonProxy {
return this.clientHandler.getEnergyCrystalAlpha();
}
@Override
public void tryRepositionPlayerOnMount(int entityId) {
this.clientHandler.tryRepositionPlayerOnMount(entityId);
}
@@ -28,6 +28,7 @@ import com.brandon3055.draconicevolution.client.utils.guicomponents.GUIBase;
import com.brandon3055.draconicevolution.common.container.ContainerAdvTool;
import com.brandon3055.draconicevolution.common.handler.ContributorHandler;
import com.brandon3055.draconicevolution.common.items.weapons.BowHandler;
import com.brandon3055.draconicevolution.common.items.weapons.IEnergyContainerBowItem;
import com.brandon3055.draconicevolution.common.lib.References;
import com.brandon3055.draconicevolution.common.network.ContributorPacket;
import com.brandon3055.draconicevolution.common.network.ItemConfigPacket;
@@ -310,11 +311,11 @@ public class GUIToolConfig extends GUIBase {
super.drawGuiContainerForegroundLayer(mouseX, mouseY);
if (slot > -1) editingItem = player.inventory.getStackInSlot(slot);
if (slot > -1 && editingItem != null && editingItem.getUnlocalizedName().toLowerCase().contains("bow")) {
if (slot > -1 && editingItem != null && editingItem.getItem() instanceof IEnergyContainerBowItem) {
BowHandler.BowProperties properties = new BowHandler.BowProperties(editingItem, player);
if (!properties.canFire() && properties.cantFireMessage != null
&& !properties.cantFireMessage.equals("msg.de.outOfArrows.name")) {
&& !properties.cantFireMessage.equals("msg.de.outOfArrows.txt")) {
fontRendererObj.drawSplitString(
StatCollector.translateToLocal(properties.cantFireMessage),
0,
@@ -139,6 +139,17 @@ public final class HudHandler {
showShieldHud = false;
return;
}
if (!shouldDisplayArmorHud(summary)) {
showShieldHud = false;
armorStatsFadeOut = 0F;
maxShieldPoints = 0F;
shieldPoints = 0F;
shieldPercentCharge = 0;
shieldEntropy = 0F;
rfCharge = 0;
rfTotal = 0;
return;
}
showShieldHud = armorStatsFadeOut > 0F;
if (maxShieldPoints != summary.maxProtectionPoints || shieldPoints != summary.protectionPoints
@@ -155,6 +166,10 @@ public final class HudHandler {
rfTotal = summary.totalEnergyStored;
}
private boolean shouldDisplayArmorHud(ArmorSummary summary) {
return summary.maxProtectionPoints > 0F || summary.maxTotalEnergyStorage > 0;
}
private void drawArmorHUD(int x, int y, boolean rotated, double scale) {
GL11.glPushMatrix();
GL11.glEnable(GL11.GL_ALPHA_TEST);
@@ -15,6 +15,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.imageio.ImageIO;
@@ -48,7 +49,7 @@ public class ResourceHandler {
private static ResourceLocation particles = new ResourceLocation(
References.RESOURCESPREFIX + "textures/particle/particles.png");
private static Map<String, ResourceLocation> cachedResources = new HashMap<String, ResourceLocation>();
public static Map<String, CustomResourceLocation> downloadedImages = new HashMap<String, CustomResourceLocation>();
public static Map<String, CustomResourceLocation> downloadedImages = new ConcurrentHashMap<>();
private static String savePath;
private static File saveFolder;
@@ -64,7 +65,6 @@ public class ResourceHandler {
if (downloadThread.isReloadRequired()) LogHelper.info("Image Download Finished");
downloadStatus = downloadThread.wasSuccessful ? 1 : 2;
FMLCommonHandler.instance().bus().unregister(this);
addRSPack(event != null);
downloadThread = null;
}
}
@@ -74,6 +74,10 @@ public class ResourceHandler {
if (event != null) savePath = event.getModConfigurationDirectory().getParentFile().getAbsolutePath()
+ "/config/draconicevolution";
// Register the namespace before FML's final reload; folder-pack files are resolved on demand.
getImagesFolder();
addRSPack();
GUIManual.loadPages();
downloadThread = new DownloadThread(GUIManual.imageURLs);
@@ -83,7 +87,7 @@ public class ResourceHandler {
public static class DownloadThread extends Thread {
private List<String> imageURLs;
private boolean isFinished = false;
private volatile boolean isFinished = false;
private boolean wasSuccessful = true;
private boolean reloadRequired = false;
@@ -171,7 +175,7 @@ public class ResourceHandler {
}
}
private static void addRSPack(boolean refreash) {
private static void addRSPack() {
File rspack = new File(getConfigFolder(), "/resources");
if (!rspack.exists()) return;
@@ -200,7 +204,6 @@ public class ResourceHandler {
f.set(Minecraft.getMinecraft(), defaultResourcePacks);
LogHelper.info("RS Added");
if (refreash) Minecraft.getMinecraft().refreshResources();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
@@ -16,6 +16,8 @@ import com.brandon3055.draconicevolution.common.utils.DataUtils;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public final class ShieldRenderHandler {
@@ -31,6 +33,7 @@ public final class ShieldRenderHandler {
}
}
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void tickEnd(TickEvent.ClientTickEvent event) {
if (event.phase == TickEvent.Phase.END && !shieldStatus.isEmpty()) {
@@ -35,6 +35,7 @@ public class ModelRenderOBJ extends ModelRenderer {
this.compileDisplayList(scale);
}
ResourceHandler.bindTexture(texture);
GL11.glTranslatef(this.offsetX, this.offsetY, this.offsetZ);
if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) {
@@ -84,7 +85,6 @@ public class ModelRenderOBJ extends ModelRenderer {
GL11.glNewList(this.displayList, GL11.GL_COMPILE);
GL11.glPushMatrix();
ResourceHandler.bindTexture(texture);
// scale = 1F/15F;
GL11.glScalef(scale, scale, scale);
GL11.glRotatef(180, -1, 0, 1);
@@ -102,6 +102,7 @@ public class ModelRenderOBJ extends ModelRenderer {
this.compileDisplayList(scale);
}
ResourceHandler.bindTexture(texture);
GL11.glPushMatrix();
GL11.glTranslatef(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);
if (this.rotateAngleY != 0.0F) {
@@ -15,6 +15,12 @@ import com.brandon3055.draconicevolution.common.utils.LogHelper;
public class RenderMobSoul implements IItemRenderer {
public static volatile boolean applyTimeRotation = true;
public static float getRotationAngle() {
return (float) (Minecraft.getSystemTime() / -10);
}
private final Minecraft mc;
private final String[] randomEntities = new String[] { "Pig", "Sheep", "Enderman", "Zombie", "Creeper", "Cow",
"Chicken", "Ozelot", "Witch", "Wolf", "MushroomCow", "Squid", "EntityHorse", "Spider", "Skeleton", "Blaze",
@@ -58,7 +64,7 @@ public class RenderMobSoul implements IItemRenderer {
GL11.glScalef(13F, 13F, 13F);
GL11.glTranslated(1.2, 2.2, 0);
GL11.glRotatef(180F, 1F, 0F, 0F);
GL11.glRotatef(mc.getSystemTime() / -10, 0F, 1F, 0F);
if (applyTimeRotation) GL11.glRotatef(getRotationAngle(), 0F, 1F, 0F);
GL11.glRotatef(-20F, 1F, 0F, 0F);
RenderManager.instance.renderEntityWithPosYaw(mob, 0, 0, 0, 0F, 1F);
GL11.glPopMatrix();
@@ -67,7 +73,7 @@ public class RenderMobSoul implements IItemRenderer {
GL11.glScalef(0.8F, 0.8F, 0.8F);
GL11.glTranslated(2, 0.5, 0);
GL11.glRotatef(20F, 0F, 0F, 1F);
GL11.glRotatef(mc.getSystemTime() / -10, 0F, 1F, 0F);
if (applyTimeRotation) GL11.glRotatef(getRotationAngle(), 0F, 1F, 0F);
GL11.glRotatef(-20F, 1F, 0F, 0F);
RenderManager.instance.renderEntityWithPosYaw(mob, 0, 0, 0, 0F, 1F);
GL11.glPopMatrix();
@@ -76,14 +82,14 @@ public class RenderMobSoul implements IItemRenderer {
GL11.glScalef(0.8F, 0.8F, 0.8F);
GL11.glTranslated(1, 0.5, 0);
GL11.glRotatef(20F, 0F, 0F, 1F);
GL11.glRotatef(mc.getSystemTime() / -10, 0F, 1F, 0F);
if (applyTimeRotation) GL11.glRotatef(getRotationAngle(), 0F, 1F, 0F);
GL11.glRotatef(-20F, 1F, 0F, 0F);
RenderManager.instance.renderEntityWithPosYaw(mob, 0, 0, 0, 0F, 1F);
GL11.glPopMatrix();
} else {
GL11.glPushMatrix();
GL11.glScalef(1.5F, 1.5F, 1.5F);
GL11.glRotatef(mc.getSystemTime() / -10, 0F, 1F, 0F);
if (applyTimeRotation) GL11.glRotatef(getRotationAngle(), 0F, 1F, 0F);
GL11.glRotatef(-20F, 1F, 0F, 0F);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
@@ -0,0 +1,194 @@
package com.brandon3055.draconicevolution.client.render.tile;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.texture.ITickable;
import net.minecraft.item.ItemStack;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.event.world.WorldEvent;
import org.lwjgl.opengl.GL11;
import com.brandon3055.draconicevolution.client.render.item.RenderMobSoul;
import com.brandon3055.draconicevolution.common.items.MobSoul;
import com.brandon3055.draconicevolution.common.tileentities.TilePlacedItem;
import com.brandon3055.draconicevolution.common.utils.ItemNBTHelper;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
public class PlacedItemDisplayListCache {
private static final long GLINT_TTL_MS = 33L;
private static final long ANIMATED_TTL_MS = 50L;
private static final long MOBSOUL_TTL_MS = 1000L;
private static final long PRUNE_INTERVAL_MS = 1000L;
private final Map<TilePlacedItem, CacheEntry> displayListCache = new HashMap<>();
private int atlasVersion;
private long nextPruneMs;
public PlacedItemDisplayListCache() {
MinecraftForge.EVENT_BUS.register(this);
}
public CacheEntry getOrCompile(TilePlacedItem tile, ItemStack stack, int meta, Runnable renderBody) {
CacheEntry entry = displayListCache.get(tile);
if (entry == null || !entry.isValid(stack, meta, tile.rotation, atlasVersion) || entry.needsRefresh()) {
dispose(tile);
entry = compile(tile, stack, meta, renderBody);
}
return entry;
}
private CacheEntry compile(TilePlacedItem tile, ItemStack stack, int meta, Runnable renderBody) {
int listId = GL11.glGenLists(1);
boolean mobSoul = stack.getItem() instanceof MobSoul;
boolean previousRotationFlag = RenderMobSoul.applyTimeRotation;
GL11.glNewList(listId, GL11.GL_COMPILE);
try {
if (mobSoul) RenderMobSoul.applyTimeRotation = false;
renderBody.run();
GL11.glEndList();
} catch (RuntimeException | Error t) {
GL11.glEndList();
GL11.glDeleteLists(listId, 1);
RenderItem.renderInFrame = false;
throw t;
} finally {
RenderMobSoul.applyTimeRotation = previousRotationFlag;
}
CacheEntry entry = new CacheEntry(
listId,
stack,
stack.stackSize,
meta,
tile.rotation,
getTTL(stack, mobSoul),
mobSoul,
atlasVersion);
displayListCache.put(tile, entry);
return entry;
}
private long getTTL(ItemStack stack, boolean mobSoul) {
if (mobSoul) {
// "Any" soul swaps mob every second while named souls only need per-frame rotation outside the list
return isAnyMobSoul(stack) ? MOBSOUL_TTL_MS : Long.MAX_VALUE;
}
if (stack.hasEffect()) return GLINT_TTL_MS; // Glint scroll (~30 fps)
if (stack.getItem().getIconIndex(stack) instanceof ITickable) return ANIMATED_TTL_MS; // 20 Hz sprite ticks
return Long.MAX_VALUE; // static (event-invalidated)
}
private boolean isAnyMobSoul(ItemStack stack) {
return "Any".equals(ItemNBTHelper.getString(stack, "Name", "Pig"));
}
public void dispose(TilePlacedItem tile) {
CacheEntry entry = displayListCache.remove(tile);
if (entry != null) GL11.glDeleteLists(entry.listId, 1);
}
private void pruneInvalidEntries() {
if (displayListCache.isEmpty()) return;
long now = Minecraft.getSystemTime();
if (now < nextPruneMs) return;
nextPruneMs = now + PRUNE_INTERVAL_MS;
Iterator<Map.Entry<TilePlacedItem, CacheEntry>> it = displayListCache.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<TilePlacedItem, CacheEntry> entry = it.next();
TilePlacedItem tile = entry.getKey();
if (tile.isInvalid() || tile.getWorldObj() == null || tile.getStack() == null) {
GL11.glDeleteLists(entry.getValue().listId, 1);
it.remove();
}
}
}
private void clearAll() {
for (CacheEntry entry : displayListCache.values()) {
GL11.glDeleteLists(entry.listId, 1);
}
displayListCache.clear();
}
@SubscribeEvent
public void onRenderWorldLast(RenderWorldLastEvent event) {
pruneInvalidEntries();
}
@SubscribeEvent
public void onTextureStitch(TextureStitchEvent.Post event) {
atlasVersion++;
clearAll();
}
@SubscribeEvent
public void onChunkUnload(ChunkEvent.Unload event) {
if (!event.world.isRemote) return;
Chunk chunk = event.getChunk();
Iterator<Map.Entry<TilePlacedItem, CacheEntry>> it = displayListCache.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<TilePlacedItem, CacheEntry> e = it.next();
TilePlacedItem tile = e.getKey();
if ((tile.xCoord >> 4) == chunk.xPosition && (tile.zCoord >> 4) == chunk.zPosition) {
GL11.glDeleteLists(e.getValue().listId, 1);
it.remove();
}
}
}
@SubscribeEvent
public void onWorldUnload(WorldEvent.Unload event) {
if (!event.world.isRemote) return;
clearAll();
}
public static class CacheEntry {
public final int listId;
public final ItemStack stack;
public final int stackSize;
public final int meta;
public final float rotation;
public final long ttlMs;
public final boolean mobSoul;
public final int atlasVersion;
private long lastCompileMs;
private CacheEntry(int listId, ItemStack stack, int stackSize, int meta, float rotation, long ttlMs,
boolean mobSoul, int atlasVersion) {
this.listId = listId;
this.stack = stack;
this.stackSize = stackSize;
this.meta = meta;
this.rotation = rotation;
this.ttlMs = ttlMs;
this.mobSoul = mobSoul;
this.atlasVersion = atlasVersion;
this.lastCompileMs = System.currentTimeMillis();
}
private boolean isValid(ItemStack stack, int meta, float rotation, int atlasVersion) {
// checking the pointer of the stack is enough
return this.stack == stack && this.stackSize == stack.stackSize
&& this.meta == meta
&& this.rotation == rotation
&& this.atlasVersion == atlasVersion;
}
private boolean needsRefresh() {
return ttlMs != Long.MAX_VALUE && System.currentTimeMillis() - lastCompileMs >= ttlMs;
}
}
}
@@ -14,6 +14,8 @@ import net.minecraft.tileentity.TileEntity;
import org.lwjgl.opengl.GL11;
import com.brandon3055.draconicevolution.client.render.item.RenderMobSoul;
import com.brandon3055.draconicevolution.client.render.tile.PlacedItemDisplayListCache.CacheEntry;
import com.brandon3055.draconicevolution.common.items.MobSoul;
import com.brandon3055.draconicevolution.common.tileentities.TilePlacedItem;
@@ -22,16 +24,33 @@ import com.brandon3055.draconicevolution.common.tileentities.TilePlacedItem;
*/
public class RenderTilePlacedItem extends TileEntitySpecialRenderer {
private static final float MOBSOUL_CENTER_X = 0.5F;
private static final float MOBSOUL_CENTER_Y = 0.3F;
private static final float MOBSOUL_CENTER_Z = 0.5F;
private final EntityItem cachedEntity = new EntityItem(null, 0, 0, 0, new ItemStack(Items.apple));
private final PlacedItemDisplayListCache displayListCache = new PlacedItemDisplayListCache();
@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float timeSinceLastTick) {
if (!(te instanceof TilePlacedItem tile)) return;
if (tile.getStack() == null) return;
ItemStack stack = tile.getStack();
if (stack == null) {
displayListCache.dispose(tile);
return;
}
if (tile.getWorldObj() == null) return;
int meta = tile.getWorldObj().getBlockMetadata(tile.xCoord, tile.yCoord, tile.zCoord);
CacheEntry entry = displayListCache.getOrCompile(tile, stack, meta, () -> renderItem(tile));
GL11.glPushMatrix();
GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glTranslated(x, y, z);
renderItem(tile);
if (entry.mobSoul) {
GL11.glTranslated(MOBSOUL_CENTER_X, MOBSOUL_CENTER_Y, MOBSOUL_CENTER_Z);
GL11.glRotatef(RenderMobSoul.getRotationAngle(), 0F, 1F, 0F);
GL11.glTranslated(-MOBSOUL_CENTER_X, -MOBSOUL_CENTER_Y, -MOBSOUL_CENTER_Z);
}
GL11.glCallList(entry.listId);
GL11.glPopAttrib();
GL11.glPopMatrix();
}
@@ -39,7 +58,6 @@ public class RenderTilePlacedItem extends TileEntitySpecialRenderer {
public void renderItem(TilePlacedItem tile) {
ItemStack stack = tile.getStack();
int meta = tile.getWorldObj().getBlockMetadata(tile.xCoord, tile.yCoord, tile.zCoord);
// itemEntity.getEntityItem().stackSize = 1;
final Item item = stack.getItem();
boolean is3D = item.isFull3D();
boolean isBlock = item instanceof ItemBlock;
@@ -58,7 +76,7 @@ public class RenderTilePlacedItem extends TileEntitySpecialRenderer {
GL11.glRotatef(tile.rotation, 0F, 0F, 1F);
GL11.glTranslatef(0.0F, -0.21F, 0.0F);
} else if (item instanceof MobSoul) {
GL11.glTranslatef(0.5F, 0.3F, 0.5F);
GL11.glTranslatef(MOBSOUL_CENTER_X, MOBSOUL_CENTER_Y, MOBSOUL_CENTER_Z);
} else {
GL11.glRotatef(90F, -1F, 0F, 0F);
GL11.glTranslatef(0.5F, -0.65F, 0.02F);
@@ -335,6 +335,8 @@ public class CommonProxy {
return dragonChunkLoader;
}
public void tryRepositionPlayerOnMount(int entityId) {}
public void registerInhibitor(TileDislocatorInhibitor tile) {
if (tile.hasWorldObj()) {
registerInhibitor(this.serverInhibitorsMap, tile);
@@ -8,6 +8,9 @@ import net.minecraft.world.World;
import com.brandon3055.draconicevolution.DraconicEvolution;
import com.brandon3055.draconicevolution.client.render.particle.Particles;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* Created by brandon3055 on 30/9/2015.
*/
@@ -62,18 +65,14 @@ public class EntityChaosBolt extends Entity {
if (ticks == 10 && !burst) {
if (worldObj.isRemote) {
DraconicEvolution.clientProxy().spawnParticle(
new Particles.ChaosBoltParticle(worldObj, posX, posY, posZ, shardX, shardY, shardZ, 10),
32);
spawnParticles(10);
}
setDead();
} else if (ticks > 10) {
if (ticks < 25) {
for (int i = 0; i < 20; i++) {
if (worldObj.isRemote) {
DraconicEvolution.clientProxy().spawnParticle(
new Particles.ChaosBoltParticle(worldObj, posX, posY, posZ, shardX, shardY, shardZ, 0),
32);
spawnParticles(0);
}
}
}
@@ -86,6 +85,13 @@ public class EntityChaosBolt extends Entity {
ticks++;
}
@SideOnly(Side.CLIENT)
private void spawnParticles(int mode) {
DraconicEvolution.clientProxy().spawnParticle(
new Particles.ChaosBoltParticle(worldObj, posX, posY, posZ, shardX, shardY, shardZ, mode),
32);
}
@Override
protected void readEntityFromNBT(NBTTagCompound compound) {
// if (compound.hasKey("ShardPos")){
@@ -13,6 +13,8 @@ import com.brandon3055.draconicevolution.common.network.GenericParticlePacket;
import com.brandon3055.draconicevolution.common.utils.handlers.ProcessHandler;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* Created by brandon3055 on 3/10/2015.
@@ -41,12 +43,10 @@ public class EntityChaosVortex extends Entity {
else ticksExisted = dataWatcher.getWatchableObjectInt(20);
if (ticksExisted < 30 && ticksExisted % 5 == 0 && worldObj.isRemote) {
DraconicEvolution.clientProxy()
.spawnParticle(new Particles.ChaosExpansionParticle(worldObj, posX, posY, posZ, false), 512);
spawnChaosParticles(false);
}
if (ticksExisted >= 100 && ticksExisted < 130 && ticksExisted % 5 == 0 && worldObj.isRemote) {
DraconicEvolution.clientProxy()
.spawnParticle(new Particles.ChaosExpansionParticle(worldObj, posX, posY, posZ, true), 512);
spawnChaosParticles(true);
}
if (ticksExisted < 100) return;
@@ -55,9 +55,7 @@ public class EntityChaosVortex extends Entity {
double y = posY - 8 + rand.nextDouble() * 16;
double z = posZ - 18 + rand.nextDouble() * 36;
if (worldObj.isRemote) {
DraconicEvolution.clientProxy().spawnParticle(
new Particles.AdvancedSeekerParticle(worldObj, x, y, z, posX, posY, posZ, 2, 1f, 1f, 1f, 100),
128);
spawnSeekerParticles(x, y, z);
}
}
@@ -73,6 +71,19 @@ public class EntityChaosVortex extends Entity {
if (ticksExisted > 620) setDead();
}
@SideOnly(Side.CLIENT)
private void spawnChaosParticles(boolean shrink) {
DraconicEvolution.clientProxy()
.spawnParticle(new Particles.ChaosExpansionParticle(worldObj, posX, posY, posZ, shrink), 512);
}
@SideOnly(Side.CLIENT)
private void spawnSeekerParticles(double x, double y, double z) {
DraconicEvolution.clientProxy().spawnParticle(
new Particles.AdvancedSeekerParticle(worldObj, x, y, z, posX, posY, posZ, 2, 1f, 1f, 1f, 100),
128);
}
private void shakeScreen() {
double intensity = (ticksExisted - 130) / 100D;
if (intensity > 1D) intensity = 1D;
@@ -39,9 +39,11 @@ import com.gtnewhorizon.gtnhlib.GTNHLib;
import baubles.api.BaubleType;
import baubles.api.IBauble;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import vazkii.botania.common.block.subtile.functional.SubTileSolegnolia;
/**
* Created by brandon3055 on 9/3/2016.
@@ -50,6 +52,8 @@ import cpw.mods.fml.relauncher.SideOnly;
@Optional.Interface(iface = "baubles.api.IBauble", modid = "Baubles")
public class Magnet extends ItemDE implements IBauble, IConfigurableItem {
private static final boolean BOTANIA_LOADED = Loader.isModLoaded("Botania");
private IIcon draconium;
private IIcon awakened;
@@ -61,8 +65,10 @@ public class Magnet extends ItemDE implements IBauble, IConfigurableItem {
DELAY,
NEVER;
public static final SelfPickUpMode[] VALUES = values();
public SelfPickUpMode next() {
final SelfPickUpMode[] values = SelfPickUpMode.values();
final SelfPickUpMode[] values = SelfPickUpMode.VALUES;
return values[(this.ordinal() + 1) % values.length];
}
}
@@ -118,6 +124,9 @@ public class Magnet extends ItemDE implements IBauble, IConfigurableItem {
if (IConfigurableItem.ProfileHelper.getBoolean(stack, References.MAGNET_SNEAK, true) && entity.isSneaking()) {
return;
}
if (BOTANIA_LOADED && SubTileSolegnolia.hasSolegnoliaAround(player)) {
return;
}
int range = stack.getItemDamage() == 0 ? 8 : 32;
List<EntityItem> items = world.getEntitiesWithinAABB(
@@ -265,7 +274,7 @@ public class Magnet extends ItemDE implements IBauble, IConfigurableItem {
private static SelfPickUpMode getSelfPickupStatus(ItemStack itemStack) {
final short mode = getSelfPickupStatusShort(itemStack);
return SelfPickUpMode.values()[mode];
return SelfPickUpMode.VALUES[mode];
}
public static void toggleSelfPickupStatus(ItemStack itemStack) {
@@ -158,8 +158,8 @@ public class BowHandler {
public int calculateEnergyCost() {
updateValues();
double rfCost = (bow.getItem() instanceof IEnergyContainerWeaponItem)
? ((IEnergyContainerWeaponItem) bow.getItem()).getEnergyPerAttack()
double rfCost = (bow.getItem() instanceof IEnergyContainerBowItem)
? ((IEnergyContainerBowItem) bow.getItem()).getEnergyPerAttack()
: 80;
rfCost *= 1 + arrowDamage;
@@ -175,7 +175,7 @@ public class BowHandler {
updateValues();
if (player == null) return false;
if (!(bow.getItem() instanceof IEnergyContainerWeaponItem)) {
if (!(bow.getItem() instanceof IEnergyContainerBowItem)) {
cantFireMessage = "[Error] This bow is not a valid energy container (This is a bug, Please report on the Draconic Evolution github)";
return false;
} else if (!energyBolt && shockWavePower > 0) {
@@ -184,7 +184,7 @@ public class BowHandler {
} else if (energyBolt && explosionPower > 0) {
cantFireMessage = "msg.de.explosiveNotForEnergyBolts.txt";
return false;
} else if (calculateEnergyCost() > ((IEnergyContainerWeaponItem) bow.getItem()).getEnergyStored(bow)
} else if (calculateEnergyCost() > ((IEnergyContainerBowItem) bow.getItem()).getEnergyStored(bow)
&& !player.capabilities.isCreativeMode) {
cantFireMessage = "msg.de.insufficientPowerToFire.txt";
return false;
@@ -223,7 +223,7 @@ public class BowHandler {
public boolean consumeArrowAndEnergy() {
if (!player.capabilities.isCreativeMode)
((IEnergyContainerWeaponItem) bow.getItem()).extractEnergy(bow, calculateEnergyCost(), false);
((IEnergyContainerBowItem) bow.getItem()).extractEnergy(bow, calculateEnergyCost(), false);
if (!energyBolt && EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, bow) == 0
&& !player.capabilities.isCreativeMode) {
@@ -39,7 +39,7 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class DraconicBow extends ItemBow
implements IInventoryTool, IUpgradableItem, IEnergyContainerWeaponItem, IHudDisplayItem {
implements IInventoryTool, IUpgradableItem, IEnergyContainerBowItem, IHudDisplayItem {
public static final String[] bowPullIconNameArray = new String[] { "pulling_0", "pulling_1", "pulling_2" };
@@ -0,0 +1,4 @@
package com.brandon3055.draconicevolution.common.items.weapons;
public interface IEnergyContainerBowItem extends IEnergyContainerWeaponItem {
}
@@ -39,7 +39,7 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class WyvernBow extends ItemBow
implements IInventoryTool, IUpgradableItem, IEnergyContainerWeaponItem, IHudDisplayItem {
implements IInventoryTool, IUpgradableItem, IEnergyContainerBowItem, IHudDisplayItem {
public static final String[] bowPullIconNameArray = new String[] { "pulling_0", "pulling_1", "pulling_2" };
@@ -45,7 +45,7 @@ public class MountUpdatePacket implements IMessage {
return null;
}
DraconicEvolution.clientProxy().tryRepositionPlayerOnMount(message.entityID);
DraconicEvolution.proxy.tryRepositionPlayerOnMount(message.entityID);
return null;
}
}
@@ -55,9 +55,9 @@ public class TileChaosShard extends TileEntity {
public void detonate() {
if (!worldObj.isRemote
&& locationHash != getLocationHash(xCoord, yCoord, zCoord, worldObj.provider.dimensionId))
&& locationHash != getLocationHash(xCoord, yCoord, zCoord, worldObj.provider.dimensionId)) {
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
else {
} else {
EntityChaosVortex vortex = new EntityChaosVortex(worldObj);
vortex.setPosition(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
worldObj.spawnEntityInWorld(vortex);
@@ -7,6 +7,7 @@ import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.Vec3;
import com.brandon3055.draconicevolution.common.ModBlocks;
@@ -20,6 +21,16 @@ public class TilePlacedItem extends TileEntity {
public ItemStack stack;
public float rotation = 0F;
private boolean hasUpdated = false;
private AxisAlignedBB renderBoundingBox;
@Override
public AxisAlignedBB getRenderBoundingBox() {
if (renderBoundingBox == null) {
renderBoundingBox = AxisAlignedBB
.getBoundingBox(xCoord - 2, yCoord - 2, zCoord - 2, xCoord + 2, yCoord + 2, zCoord + 2);
}
return renderBoundingBox;
}
@Override
public void updateEntity() {
@@ -47,19 +47,16 @@ public class TileEnergyRelay extends TileRemoteEnergyBase {
super.updateEntity();
if (worldObj.isRemote) {
ring = DraconicEvolution.clientProxy().energyField(
worldObj,
xCoord + 0.5,
yCoord + 0.5,
zCoord + 0.5,
0,
powerTier == 1,
ring,
inView > 0);
return;
spawnEnergyField();
}
}
@SideOnly(Side.CLIENT)
private void spawnEnergyField() {
ring = DraconicEvolution.clientProxy()
.energyField(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 0, powerTier == 1, ring, inView > 0);
}
@Override
public void writeToNBT(NBTTagCompound compound) {
super.writeToNBT(compound);
@@ -78,7 +78,14 @@ public class TileEnergyTransceiver extends TileRemoteEnergyBase {
}
}
if (worldObj.isRemote) particle = DraconicEvolution.clientProxy()
if (worldObj.isRemote) {
spawnParticle();
}
}
@SideOnly(Side.CLIENT)
private void spawnParticle() {
particle = DraconicEvolution.clientProxy()
.energyField(worldObj, getBeamX(), getBeamY(), getBeamZ(), 1, powerTier == 1, particle, inView > 0);
}
@@ -100,19 +100,7 @@ public abstract class TileRemoteEnergyBase extends TileObjectSync implements IRe
rType = 1;
else rType = 0;
}
device.beam = DraconicEvolution.clientProxy().energyBeam(
worldObj,
getBeamX(),
getBeamY(),
getBeamZ(),
remoteTile.getBeamX(),
remoteTile.getBeamY(),
remoteTile.getBeamZ(),
(int) device.energyFlow,
getPowerTier() == 1,
device.beam,
true,
rType);
updateBeam(device, remoteTile, rType);
} else {
double difference = getCapacity() - remoteTile.getCapacity();
double energyToEqual = Math
@@ -137,6 +125,23 @@ public abstract class TileRemoteEnergyBase extends TileObjectSync implements IRe
}
}
@SideOnly(Side.CLIENT)
private void updateBeam(LinkedEnergyDevice device, IRemoteEnergyHandler remoteTile, int rType) {
device.beam = DraconicEvolution.clientProxy().energyBeam(
worldObj,
getBeamX(),
getBeamY(),
getBeamZ(),
remoteTile.getBeamX(),
remoteTile.getBeamY(),
remoteTile.getBeamZ(),
(int) device.energyFlow,
getPowerTier() == 1,
device.beam,
true,
rType);
}
protected void detectAndSendChanges(int index) {
if (worldObj.isRemote) return;
@@ -62,32 +62,13 @@ public class TileWirelessEnergyTransceiver extends TileRemoteEnergyBase {
super.updateEntity();
if (worldObj.isRemote) {
ring = DraconicEvolution.clientProxy().energyField(
worldObj,
xCoord + 0.5,
yCoord + 0.5,
zCoord + 0.5,
2,
powerTier == 1,
ring,
inView > 0);
spawnEnergyField();
for (LinkedReceiver receiver : receiverList) {
int particleValue = 200;
if (receiver.particleEnergyCounter > particleValue) {
receiver.particleEnergyCounter -= particleValue;
// todo detect box size
DraconicEvolution.clientProxy().spawnParticle(
new Particles.TransceiverParticle(
worldObj,
xCoord + 0.5,
yCoord + 0.3 + (worldObj.rand.nextDouble() * 0.4),
zCoord + 0.5,
receiver.xCoord + worldObj.rand.nextDouble(),
receiver.yCoord + worldObj.rand.nextDouble(),
receiver.zCoord + worldObj.rand.nextDouble()),
64);
spawnParticles(receiver);
}
}
} else {
@@ -120,6 +101,27 @@ public class TileWirelessEnergyTransceiver extends TileRemoteEnergyBase {
}
}
@SideOnly(Side.CLIENT)
private void spawnEnergyField() {
ring = DraconicEvolution.clientProxy()
.energyField(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 2, powerTier == 1, ring, inView > 0);
}
@SideOnly(Side.CLIENT)
private void spawnParticles(LinkedReceiver receiver) {
// todo detect box size
DraconicEvolution.clientProxy().spawnParticle(
new Particles.TransceiverParticle(
worldObj,
xCoord + 0.5,
yCoord + 0.3 + (worldObj.rand.nextDouble() * 0.4),
zCoord + 0.5,
receiver.xCoord + worldObj.rand.nextDouble(),
receiver.yCoord + worldObj.rand.nextDouble(),
receiver.zCoord + worldObj.rand.nextDouble()),
64);
}
@SideOnly(Side.CLIENT)
@Override
public void receiveObjectFromServer(int index, Object object) {