Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,14 @@ There are a few paper-cuts in developing mods (especially for older versions of
them is to build and run the project using IntelliJ IDEA. It seems to build everything from source, as opposed to the
`./gradlew runClient` and `./gradlew runServer` scripts, which fail at bootup.

### Troubleshooting
- IntelliJ freaks out and can't find symbols in the project, but compiles fine.
- `File > Invalidate Caches/Restart` works like a charm <3

## Creating addons
Addons are a way to extend the functionality of Mo' Bends, e.g. adding support for new mobs.

There's an example addon that I set up a while back, but the sources for CustomNPCs are not longer available, which
makes it impossible to use. I'm looking for a replacement soon.
There's an example addon that I set up a while back, but the sources for CustomNPCs are
no longer available, which makes it impossible to use. I'm looking for a replacement soon.

[CustomNPCs Support Addon](https://github.com/mobends/mobends-addon-customnpcs)
8 changes: 8 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,13 @@ shadowJar.finalizedBy('reobfShadowJar')
// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing
//publish.dependsOn('reobfShadowJar')

task srcJar(type: Jar) {
build.dependsOn it
from sourceSets.main.allSource
classifier = 'sources'
from file("LICENSE")
}

processResources {
// this will ensure that this task is redone when the versions change.
inputs.property "version", mod_version
Expand Down Expand Up @@ -171,6 +178,7 @@ publishing {
publications {
mavenJava(MavenPublication) {
artifact shadowJar
artifact srcJar
}
}
repositories {
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
org.gradle.jvmargs=-Xmx5G
org.gradle.daemon=false

mod_version=1.1.0
mod_version=1.2.1
minecraft_version=1.12.2
forge_version=14.23.5.2859
mappings_channel=snapshot
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

public abstract class AnimationBit<T extends EntityData<?>>
{

/**
* The layer that this bit is performed by. Used to callback, e.g. when the animation is finished.
*/
Expand All @@ -23,7 +22,7 @@ public void setupForPlay(AnimationLayer<? extends T> layer, T entityData)
/**
* Returns the actions currently being performed by the entityData. Used by BendsPacks
*/
public abstract String[] getActions(T entityData);
public String[] getActions(T entityData) { return new String[] {}; }

/**
* Called by setupForPlay to setup the beginning of this animation bit.
Expand All @@ -34,5 +33,4 @@ public void onPlay(T entityData) {}
* Called by an AnimationLayer to perform a continuous animation.
*/
public abstract void perform(T entityData);

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

public class KeyframeAnimationBit<T extends EntityData<?>> extends AnimationBit<T>
{

protected KeyframeAnimation performedAnimation = null;
private ArmatureMask mask = null;
private TriggerMode triggerMode = TriggerMode.RETRIGGER;
Expand Down Expand Up @@ -162,5 +161,4 @@ public static enum TriggerMode
RETRIGGER,
CONTINUE
}

}
Original file line number Diff line number Diff line change
@@ -1,27 +1,37 @@
package goblinbob.mobends.core.animation.keyframe;

import goblinbob.mobends.core.util.SerialHelper;
import org.apache.http.util.ByteArrayBuffer;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;

public class BinaryAnimationLoader
{
private static final String HEADER = "BENDSANIM";

private static final byte HAS_POSITION = 1;
private static final byte HAS_ROTATION = 2;
private static final byte HAS_SCALE = 4;

public static KeyframeAnimation loadFromBinaryInputStream(InputStream stream) throws IOException
{
DataInputStream dataInputStream = new DataInputStream(stream);

// Checking header
String header = SerialHelper.readChar(dataInputStream, HEADER.length());
if (!header.equals(HEADER))
{
throw new IOException("File doesn't start with the header.");
}

KeyframeAnimation animation = new KeyframeAnimation();
animation.bones = new HashMap<>();

DataInputStream dataInputStream = new DataInputStream(stream);

int version = dataInputStream.readInt();
int amountOfKeyframes = dataInputStream.readInt();
int amountOfBones = dataInputStream.readInt();
Expand All @@ -36,7 +46,7 @@ public static KeyframeAnimation loadFromBinaryInputStream(InputStream stream) th
character = dataInputStream.readByte();
}

String boneName = new String(buffer.toByteArray(), "UTF-8");
String boneName = new String(buffer.toByteArray(), StandardCharsets.UTF_8);
Bone bone = new Bone();
bone.keyframes = new ArrayList<>();

Expand Down
6 changes: 0 additions & 6 deletions src/main/java/goblinbob/mobends/core/bender/EntityBender.java
Original file line number Diff line number Diff line change
Expand Up @@ -186,12 +186,6 @@ protected T createPreviewEntity()
return null;
}

public void transformModelToCharacterSpace(IMat4x4d matrixOut)
{
TransformUtils.scale(matrixOut, -1.0F, -1.0F, 1.0F);
TransformUtils.translate(matrixOut, 0.0F, -1.501F, 0.0F);
}

public Mutator<?, ?, ?> getMutator(RenderLivingBase<? extends EntityLivingBase> renderer)
{
return this.mutatorMap.get(renderer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,40 +63,25 @@ public <E extends EntityLivingBase> EntityBender<E> getForEntityClass(Class<E> c

public <E extends EntityLivingBase> EntityBender<E> getForEntity(E entity)
{
if (entityToBenderMap.containsKey(entity))
// noinspection unchecked
return (EntityBender<E>) entityToBenderMap.get(entity);
// noinspection unchecked
return (EntityBender<E>) entityToBenderMap.computeIfAbsent(entity, key -> {
// Checking the config blacklist
if (ModConfig.shouldKeepEntityAsVanilla(entity))
return null;

// Checking direct registration
Class<? extends EntityLivingBase> entityClass = entity.getClass();
for (EntityBender<?> entityBender : entityClassToBenderMap.values())
if (entityBender.entityClass.equals(entityClass))
return entityBender;

// Checking indirect inheritance
for (EntityBender<?> entityBender : entityClassToBenderMap.values())
if (entityBender.entityClass.isInstance(entity))
return entityBender;

// Checking the config blacklist
if (ModConfig.shouldKeepEntityAsVanilla(entity))
{
return null;
}

// Checking direct registration
Class<? extends EntityLivingBase> entityClass = entity.getClass();
for (EntityBender<?> entityBender : entityClassToBenderMap.values())
{
if (entityBender.entityClass.equals(entityClass))
{
entityToBenderMap.put(entity, entityBender);
// noinspection unchecked
return (EntityBender<E>) entityBender;
}
}

// Checking indirect inheritance
for (EntityBender<?> entityBender : entityClassToBenderMap.values())
{
if (entityBender.entityClass.isInstance(entity))
{
entityToBenderMap.put(entity, entityBender);
// noinspection unchecked
return (EntityBender<E>) entityBender;
}
}

return null;
});
}

public <E extends EntityLivingBase> void clearCache(E entity)
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/goblinbob/mobends/core/util/SerialHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package goblinbob.mobends.core.util;

import org.apache.http.util.ByteArrayBuffer;

import java.io.DataInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class SerialHelper
{
public static String readChar(DataInputStream stream, int length) throws IOException
{
ByteArrayBuffer buffer = new ByteArrayBuffer(length);
for (int i = 0; i < length; ++i)
{
buffer.append(stream.readByte());
}

return new String(buffer.toByteArray(), StandardCharsets.UTF_8);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package goblinbob.mobends.standard;

public enum AttackActionType
{
TOOL,
FISTS,
SWORD,
}
8 changes: 8 additions & 0 deletions src/main/java/goblinbob/mobends/standard/UseActionType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package goblinbob.mobends.standard;

public enum UseActionType
{
FOOD,
BOW,
SHIELD,
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,7 @@

public class AttackSlashDownAnimationBit extends AnimationBit<BipedEntityData<?>>
{
private static final String[] ACTIONS = new String[] { "attack", "attack_slash_down" };

private float ticksPlayed;

@Override
public String[] getActions(BipedEntityData<?> entityData)
{
return ACTIONS;
}

@Override
public void onPlay(BipedEntityData<?> data)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

public class AttackSlashInwardAnimationBit extends AnimationBit<BipedEntityData<?>>
{

private static final String[] ACTIONS = new String[] { "attack", "attack_slash_inward" };

@Override
Expand Down Expand Up @@ -89,5 +88,4 @@ public void perform(BipedEntityData<?> data)

mainItemRotation.setSmoothness(.9F).orientInstantX(50.0F);
}

}
Original file line number Diff line number Diff line change
@@ -1,38 +1,32 @@
package goblinbob.mobends.standard.animation.bit.player;
package goblinbob.mobends.standard.animation.bit.biped;

import goblinbob.mobends.core.animation.bit.AnimationBit;
import goblinbob.mobends.core.client.event.DataUpdateHandler;
import goblinbob.mobends.core.client.model.IModelPart;
import goblinbob.mobends.core.math.SmoothOrientation;
import goblinbob.mobends.standard.data.PlayerData;
import net.minecraft.client.entity.AbstractClientPlayer;
import goblinbob.mobends.standard.data.BipedEntityData;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.util.EnumHandSide;
import net.minecraft.util.math.MathHelper;

public class AttackStanceAnimationBit extends AnimationBit<PlayerData>
public class AttackStanceAnimationBit extends AnimationBit<BipedEntityData<?>>
{
protected final float PI = (float) Math.PI;
protected final float kneelDuration = 0.15F;
protected final float legSpreadSpeed = 0.1F;
protected float legSpreadAnimation = 0F;

@Override
public String[] getActions(PlayerData entityData)
{
return new String[] { "attack_stance" };
}


@Override
public void onPlay(PlayerData entityData)
public void onPlay(BipedEntityData<?> entityData)
{
this.legSpreadAnimation = 0F;
}

@Override
public void perform(PlayerData data)
public void perform(BipedEntityData<?> data)
{
AbstractClientPlayer player = data.getEntity();
EnumHandSide primaryHand = player.getPrimaryHand();
EntityLivingBase entity = data.getEntity();
EnumHandSide primaryHand = entity.getPrimaryHand();

boolean mainHandSwitch = primaryHand == EnumHandSide.RIGHT;
// Main Hand Direction Multiplier - it helps switch animation sides depending on
Expand All @@ -42,10 +36,6 @@ public void perform(PlayerData data)
IModelPart offArm = mainHandSwitch ? data.leftArm : data.rightArm;
IModelPart mainForeArm = mainHandSwitch ? data.rightForeArm : data.leftForeArm;
IModelPart offForeArm = mainHandSwitch ? data.leftForeArm : data.rightForeArm;
IModelPart mainLeg = mainHandSwitch ? data.rightLeg : data.leftLeg;
IModelPart offLeg = mainHandSwitch ? data.leftLeg : data.rightLeg;
IModelPart mainForeLeg = mainHandSwitch ? data.rightForeLeg : data.leftForeLeg;
IModelPart offForeLeg = mainHandSwitch ? data.leftForeLeg : data.rightForeLeg;
SmoothOrientation mainItemRotation = mainHandSwitch ? data.renderRightItemRotation : data.renderLeftItemRotation;

// ItemStack offHandItemStack = player.getHeldItemOffhand();
Expand Down Expand Up @@ -89,5 +79,4 @@ public void perform(PlayerData data)
data.globalOffset.setY(-MathHelper.sin(touchdown * PI) * 2F - 2F);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,6 @@

public class AttackStanceSprintAnimationBit extends AnimationBit<BipedEntityData<?>>
{

private static final String[] ACTIONS = new String[] { "attack_stance_sprint" };

@Override
public String[] getActions(BipedEntityData<?> entityData)
{
return ACTIONS;
}

@Override
public void perform(BipedEntityData<?> data)
{
Expand All @@ -44,7 +35,7 @@ public void perform(BipedEntityData<?> data)
data.body.rotation.rotateY(20 * handDirMtp);
data.head.rotation.rotateY(-20 * handDirMtp);
mainArm.getRotation().orientZ(60.0F * handDirMtp);
mainArm.getRotation().rotateY(60.0F);
mainArm.getRotation().rotateY(60.0F * handDirMtp);
offArm.getRotation().rotateZ(-30.0F * handDirMtp);

if (mainHandSwitch)
Expand All @@ -56,5 +47,4 @@ public void perform(BipedEntityData<?> data)
data.renderLeftItemRotation.setSmoothness(.3F).orientX(45);
}
}

}
Loading