{
+ INSTANCE;
+
+ @Override
+ public RefreshTriggerByClientScRsp create() {
+ return RefreshTriggerByClientScRsp.newInstance();
+ }
+ }
+
+ /**
+ * Contains name constants used for serializing JSON
+ */
+ static class FieldNames {
+ static final FieldName triggerEntityId = FieldName.forField("triggerEntityId", "trigger_entity_id");
+
+ static final FieldName retcode = FieldName.forField("retcode");
+
+ static final FieldName refreshTrigger = FieldName.forField("refreshTrigger", "refresh_trigger");
+
+ static final FieldName triggerName = FieldName.forField("triggerName", "trigger_name");
+ }
+ }
+}
diff --git a/src/generated/main/emu/lunarcore/proto/SceneEntityInfoOuterClass.java b/src/generated/main/emu/lunarcore/proto/SceneEntityInfoOuterClass.java
index 9de264a..057a26d 100644
--- a/src/generated/main/emu/lunarcore/proto/SceneEntityInfoOuterClass.java
+++ b/src/generated/main/emu/lunarcore/proto/SceneEntityInfoOuterClass.java
@@ -49,10 +49,6 @@ public final class SceneEntityInfoOuterClass {
private final SceneNpcMonsterInfoOuterClass.SceneNpcMonsterInfo npcMonster = SceneNpcMonsterInfoOuterClass.SceneNpcMonsterInfo.newInstance();
/**
- *
- * SceneSummonUnitInfo summon_unit = 15;
- *
- *
* optional .ScenePropInfo prop = 10;
*/
private final ScenePropInfoOuterClass.ScenePropInfo prop = ScenePropInfoOuterClass.ScenePropInfo.newInstance();
@@ -62,6 +58,11 @@ public final class SceneEntityInfoOuterClass {
*/
private final SceneActorInfoOuterClass.SceneActorInfo actor = SceneActorInfoOuterClass.SceneActorInfo.newInstance();
+ /**
+ * optional .SceneSummonUnitInfo summon_unit = 15;
+ */
+ private final SceneSummonUnitInfoOuterClass.SceneSummonUnitInfo summonUnit = SceneSummonUnitInfoOuterClass.SceneSummonUnitInfo.newInstance();
+
private SceneEntityInfo() {
}
@@ -73,7 +74,7 @@ public final class SceneEntityInfoOuterClass {
}
public boolean hasEntityCase() {
- return (((bitField0_ & 0x0000000f)) != 0);
+ return (((bitField0_ & 0x0000001f)) != 0);
}
public SceneEntityInfo clearEntityCase() {
@@ -82,39 +83,53 @@ public final class SceneEntityInfoOuterClass {
clearNpcMonster();
clearProp();
clearActor();
+ clearSummonUnit();
}
return this;
}
private void clearEntityCaseOtherNpc() {
- if ((((bitField0_ & 0x0000000e)) != 0)) {
+ if ((((bitField0_ & 0x0000001e)) != 0)) {
clearNpcMonster();
clearProp();
clearActor();
+ clearSummonUnit();
}
}
private void clearEntityCaseOtherNpcMonster() {
- if ((((bitField0_ & 0x0000000d)) != 0)) {
+ if ((((bitField0_ & 0x0000001d)) != 0)) {
clearNpc();
clearProp();
clearActor();
+ clearSummonUnit();
}
}
private void clearEntityCaseOtherProp() {
- if ((((bitField0_ & 0x0000000b)) != 0)) {
+ if ((((bitField0_ & 0x0000001b)) != 0)) {
clearNpc();
clearNpcMonster();
clearActor();
+ clearSummonUnit();
}
}
private void clearEntityCaseOtherActor() {
- if ((((bitField0_ & 0x00000007)) != 0)) {
+ if ((((bitField0_ & 0x00000017)) != 0)) {
clearNpc();
clearNpcMonster();
clearProp();
+ clearSummonUnit();
+ }
+ }
+
+ private void clearEntityCaseOtherSummonUnit() {
+ if ((((bitField0_ & 0x0000000f)) != 0)) {
+ clearNpc();
+ clearNpcMonster();
+ clearProp();
+ clearActor();
}
}
@@ -123,7 +138,7 @@ public final class SceneEntityInfoOuterClass {
* @return whether the groupId field is set
*/
public boolean hasGroupId() {
- return (bitField0_ & 0x00000010) != 0;
+ return (bitField0_ & 0x00000020) != 0;
}
/**
@@ -131,7 +146,7 @@ public final class SceneEntityInfoOuterClass {
* @return this
*/
public SceneEntityInfo clearGroupId() {
- bitField0_ &= ~0x00000010;
+ bitField0_ &= ~0x00000020;
groupId = 0;
return this;
}
@@ -150,7 +165,7 @@ public final class SceneEntityInfoOuterClass {
* @return this
*/
public SceneEntityInfo setGroupId(final int value) {
- bitField0_ |= 0x00000010;
+ bitField0_ |= 0x00000020;
groupId = value;
return this;
}
@@ -160,7 +175,7 @@ public final class SceneEntityInfoOuterClass {
* @return whether the instId field is set
*/
public boolean hasInstId() {
- return (bitField0_ & 0x00000020) != 0;
+ return (bitField0_ & 0x00000040) != 0;
}
/**
@@ -168,7 +183,7 @@ public final class SceneEntityInfoOuterClass {
* @return this
*/
public SceneEntityInfo clearInstId() {
- bitField0_ &= ~0x00000020;
+ bitField0_ &= ~0x00000040;
instId = 0;
return this;
}
@@ -187,7 +202,7 @@ public final class SceneEntityInfoOuterClass {
* @return this
*/
public SceneEntityInfo setInstId(final int value) {
- bitField0_ |= 0x00000020;
+ bitField0_ |= 0x00000040;
instId = value;
return this;
}
@@ -197,7 +212,7 @@ public final class SceneEntityInfoOuterClass {
* @return whether the entityId field is set
*/
public boolean hasEntityId() {
- return (bitField0_ & 0x00000040) != 0;
+ return (bitField0_ & 0x00000080) != 0;
}
/**
@@ -205,7 +220,7 @@ public final class SceneEntityInfoOuterClass {
* @return this
*/
public SceneEntityInfo clearEntityId() {
- bitField0_ &= ~0x00000040;
+ bitField0_ &= ~0x00000080;
entityId = 0;
return this;
}
@@ -224,7 +239,7 @@ public final class SceneEntityInfoOuterClass {
* @return this
*/
public SceneEntityInfo setEntityId(final int value) {
- bitField0_ |= 0x00000040;
+ bitField0_ |= 0x00000080;
entityId = value;
return this;
}
@@ -234,7 +249,7 @@ public final class SceneEntityInfoOuterClass {
* @return whether the motion field is set
*/
public boolean hasMotion() {
- return (bitField0_ & 0x00000080) != 0;
+ return (bitField0_ & 0x00000100) != 0;
}
/**
@@ -242,7 +257,7 @@ public final class SceneEntityInfoOuterClass {
* @return this
*/
public SceneEntityInfo clearMotion() {
- bitField0_ &= ~0x00000080;
+ bitField0_ &= ~0x00000100;
motion.clear();
return this;
}
@@ -271,7 +286,7 @@ public final class SceneEntityInfoOuterClass {
* @return internal storage object for modifications
*/
public MotionInfoOuterClass.MotionInfo getMutableMotion() {
- bitField0_ |= 0x00000080;
+ bitField0_ |= 0x00000100;
return motion;
}
@@ -281,7 +296,7 @@ public final class SceneEntityInfoOuterClass {
* @return this
*/
public SceneEntityInfo setMotion(final MotionInfoOuterClass.MotionInfo value) {
- bitField0_ |= 0x00000080;
+ bitField0_ |= 0x00000100;
motion.copyFrom(value);
return this;
}
@@ -406,10 +421,6 @@ public final class SceneEntityInfoOuterClass {
}
/**
- *
- * SceneSummonUnitInfo summon_unit = 15;
- *
- *
* optional .ScenePropInfo prop = 10;
* @return whether the prop field is set
*/
@@ -418,10 +429,6 @@ public final class SceneEntityInfoOuterClass {
}
/**
- *
- * SceneSummonUnitInfo summon_unit = 15;
- *
- *
* optional .ScenePropInfo prop = 10;
* @return this
*/
@@ -432,10 +439,6 @@ public final class SceneEntityInfoOuterClass {
}
/**
- *
- * SceneSummonUnitInfo summon_unit = 15;
- *
- *
* optional .ScenePropInfo prop = 10;
*
* This method returns the internal storage object without modifying any has state.
@@ -450,10 +453,6 @@ public final class SceneEntityInfoOuterClass {
}
/**
- *
- * SceneSummonUnitInfo summon_unit = 15;
- *
- *
* optional .ScenePropInfo prop = 10;
*
* This method returns the internal storage object and sets the corresponding
@@ -469,10 +468,6 @@ public final class SceneEntityInfoOuterClass {
}
/**
- *
- * SceneSummonUnitInfo summon_unit = 15;
- *
- *
* optional .ScenePropInfo prop = 10;
* @param value the prop to set
* @return this
@@ -543,6 +538,66 @@ public final class SceneEntityInfoOuterClass {
return this;
}
+ /**
+ * optional .SceneSummonUnitInfo summon_unit = 15;
+ * @return whether the summonUnit field is set
+ */
+ public boolean hasSummonUnit() {
+ return (bitField0_ & 0x00000010) != 0;
+ }
+
+ /**
+ * optional .SceneSummonUnitInfo summon_unit = 15;
+ * @return this
+ */
+ public SceneEntityInfo clearSummonUnit() {
+ bitField0_ &= ~0x00000010;
+ summonUnit.clear();
+ return this;
+ }
+
+ /**
+ * optional .SceneSummonUnitInfo summon_unit = 15;
+ *
+ * This method returns the internal storage object without modifying any has state.
+ * The returned object should not be modified and be treated as read-only.
+ *
+ * Use {@link #getMutableSummonUnit()} if you want to modify it.
+ *
+ * @return internal storage object for reading
+ */
+ public SceneSummonUnitInfoOuterClass.SceneSummonUnitInfo getSummonUnit() {
+ return summonUnit;
+ }
+
+ /**
+ * optional .SceneSummonUnitInfo summon_unit = 15;
+ *
+ * This method returns the internal storage object and sets the corresponding
+ * has state. The returned object will become part of this message and its
+ * contents may be modified as long as the has state is not cleared.
+ *
+ * @return internal storage object for modifications
+ */
+ public SceneSummonUnitInfoOuterClass.SceneSummonUnitInfo getMutableSummonUnit() {
+ clearEntityCaseOtherSummonUnit();
+ bitField0_ |= 0x00000010;
+ return summonUnit;
+ }
+
+ /**
+ * optional .SceneSummonUnitInfo summon_unit = 15;
+ * @param value the summonUnit to set
+ * @return this
+ */
+ public SceneEntityInfo setSummonUnit(
+ final SceneSummonUnitInfoOuterClass.SceneSummonUnitInfo value) {
+ clearEntityCaseOtherSummonUnit();
+ bitField0_ |= 0x00000010;
+ summonUnit.copyFrom(value);
+ return this;
+ }
+
@Override
public SceneEntityInfo copyFrom(final SceneEntityInfo other) {
cachedSize = other.cachedSize;
@@ -556,6 +611,7 @@ public final class SceneEntityInfoOuterClass {
npcMonster.copyFrom(other.npcMonster);
prop.copyFrom(other.prop);
actor.copyFrom(other.actor);
+ summonUnit.copyFrom(other.summonUnit);
}
return this;
}
@@ -590,6 +646,9 @@ public final class SceneEntityInfoOuterClass {
if (other.hasActor()) {
getMutableActor().mergeFrom(other.actor);
}
+ if (other.hasSummonUnit()) {
+ getMutableSummonUnit().mergeFrom(other.summonUnit);
+ }
return this;
}
@@ -608,6 +667,7 @@ public final class SceneEntityInfoOuterClass {
npcMonster.clear();
prop.clear();
actor.clear();
+ summonUnit.clear();
return this;
}
@@ -623,6 +683,7 @@ public final class SceneEntityInfoOuterClass {
npcMonster.clearQuick();
prop.clearQuick();
actor.clearQuick();
+ summonUnit.clearQuick();
return this;
}
@@ -643,24 +704,25 @@ public final class SceneEntityInfoOuterClass {
&& (!hasNpc() || npc.equals(other.npc))
&& (!hasNpcMonster() || npcMonster.equals(other.npcMonster))
&& (!hasProp() || prop.equals(other.prop))
- && (!hasActor() || actor.equals(other.actor));
+ && (!hasActor() || actor.equals(other.actor))
+ && (!hasSummonUnit() || summonUnit.equals(other.summonUnit));
}
@Override
public void writeTo(final ProtoSink output) throws IOException {
- if ((bitField0_ & 0x00000010) != 0) {
+ if ((bitField0_ & 0x00000020) != 0) {
output.writeRawByte((byte) 8);
output.writeUInt32NoTag(groupId);
}
- if ((bitField0_ & 0x00000020) != 0) {
+ if ((bitField0_ & 0x00000040) != 0) {
output.writeRawByte((byte) 40);
output.writeUInt32NoTag(instId);
}
- if ((bitField0_ & 0x00000040) != 0) {
+ if ((bitField0_ & 0x00000080) != 0) {
output.writeRawByte((byte) 64);
output.writeUInt32NoTag(entityId);
}
- if ((bitField0_ & 0x00000080) != 0) {
+ if ((bitField0_ & 0x00000100) != 0) {
output.writeRawByte((byte) 34);
output.writeMessageNoTag(motion);
}
@@ -680,21 +742,25 @@ public final class SceneEntityInfoOuterClass {
output.writeRawByte((byte) 106);
output.writeMessageNoTag(actor);
}
+ if ((bitField0_ & 0x00000010) != 0) {
+ output.writeRawByte((byte) 122);
+ output.writeMessageNoTag(summonUnit);
+ }
}
@Override
protected int computeSerializedSize() {
int size = 0;
- if ((bitField0_ & 0x00000010) != 0) {
+ if ((bitField0_ & 0x00000020) != 0) {
size += 1 + ProtoSink.computeUInt32SizeNoTag(groupId);
}
- if ((bitField0_ & 0x00000020) != 0) {
+ if ((bitField0_ & 0x00000040) != 0) {
size += 1 + ProtoSink.computeUInt32SizeNoTag(instId);
}
- if ((bitField0_ & 0x00000040) != 0) {
+ if ((bitField0_ & 0x00000080) != 0) {
size += 1 + ProtoSink.computeUInt32SizeNoTag(entityId);
}
- if ((bitField0_ & 0x00000080) != 0) {
+ if ((bitField0_ & 0x00000100) != 0) {
size += 1 + ProtoSink.computeMessageSizeNoTag(motion);
}
if ((bitField0_ & 0x00000001) != 0) {
@@ -709,6 +775,9 @@ public final class SceneEntityInfoOuterClass {
if ((bitField0_ & 0x00000008) != 0) {
size += 1 + ProtoSink.computeMessageSizeNoTag(actor);
}
+ if ((bitField0_ & 0x00000010) != 0) {
+ size += 1 + ProtoSink.computeMessageSizeNoTag(summonUnit);
+ }
return size;
}
@@ -722,7 +791,7 @@ public final class SceneEntityInfoOuterClass {
case 8: {
// groupId
groupId = input.readUInt32();
- bitField0_ |= 0x00000010;
+ bitField0_ |= 0x00000020;
tag = input.readTag();
if (tag != 40) {
break;
@@ -731,7 +800,7 @@ public final class SceneEntityInfoOuterClass {
case 40: {
// instId
instId = input.readUInt32();
- bitField0_ |= 0x00000020;
+ bitField0_ |= 0x00000040;
tag = input.readTag();
if (tag != 64) {
break;
@@ -740,7 +809,7 @@ public final class SceneEntityInfoOuterClass {
case 64: {
// entityId
entityId = input.readUInt32();
- bitField0_ |= 0x00000040;
+ bitField0_ |= 0x00000080;
tag = input.readTag();
if (tag != 34) {
break;
@@ -749,7 +818,7 @@ public final class SceneEntityInfoOuterClass {
case 34: {
// motion
input.readMessage(motion);
- bitField0_ |= 0x00000080;
+ bitField0_ |= 0x00000100;
tag = input.readTag();
if (tag != 50) {
break;
@@ -791,6 +860,16 @@ public final class SceneEntityInfoOuterClass {
input.readMessage(actor);
bitField0_ |= 0x00000008;
tag = input.readTag();
+ if (tag != 122) {
+ break;
+ }
+ }
+ case 122: {
+ // summonUnit
+ clearEntityCaseOtherSummonUnit();
+ input.readMessage(summonUnit);
+ bitField0_ |= 0x00000010;
+ tag = input.readTag();
if (tag != 0) {
break;
}
@@ -812,16 +891,16 @@ public final class SceneEntityInfoOuterClass {
@Override
public void writeTo(final JsonSink output) throws IOException {
output.beginObject();
- if ((bitField0_ & 0x00000010) != 0) {
+ if ((bitField0_ & 0x00000020) != 0) {
output.writeUInt32(FieldNames.groupId, groupId);
}
- if ((bitField0_ & 0x00000020) != 0) {
+ if ((bitField0_ & 0x00000040) != 0) {
output.writeUInt32(FieldNames.instId, instId);
}
- if ((bitField0_ & 0x00000040) != 0) {
+ if ((bitField0_ & 0x00000080) != 0) {
output.writeUInt32(FieldNames.entityId, entityId);
}
- if ((bitField0_ & 0x00000080) != 0) {
+ if ((bitField0_ & 0x00000100) != 0) {
output.writeMessage(FieldNames.motion, motion);
}
if ((bitField0_ & 0x00000001) != 0) {
@@ -836,6 +915,9 @@ public final class SceneEntityInfoOuterClass {
if ((bitField0_ & 0x00000008) != 0) {
output.writeMessage(FieldNames.actor, actor);
}
+ if ((bitField0_ & 0x00000010) != 0) {
+ output.writeMessage(FieldNames.summonUnit, summonUnit);
+ }
output.endObject();
}
@@ -851,7 +933,7 @@ public final class SceneEntityInfoOuterClass {
if (input.isAtField(FieldNames.groupId)) {
if (!input.trySkipNullValue()) {
groupId = input.readUInt32();
- bitField0_ |= 0x00000010;
+ bitField0_ |= 0x00000020;
}
} else {
input.skipUnknownField();
@@ -863,7 +945,7 @@ public final class SceneEntityInfoOuterClass {
if (input.isAtField(FieldNames.instId)) {
if (!input.trySkipNullValue()) {
instId = input.readUInt32();
- bitField0_ |= 0x00000020;
+ bitField0_ |= 0x00000040;
}
} else {
input.skipUnknownField();
@@ -875,7 +957,7 @@ public final class SceneEntityInfoOuterClass {
if (input.isAtField(FieldNames.entityId)) {
if (!input.trySkipNullValue()) {
entityId = input.readUInt32();
- bitField0_ |= 0x00000040;
+ bitField0_ |= 0x00000080;
}
} else {
input.skipUnknownField();
@@ -886,7 +968,7 @@ public final class SceneEntityInfoOuterClass {
if (input.isAtField(FieldNames.motion)) {
if (!input.trySkipNullValue()) {
input.readMessage(motion);
- bitField0_ |= 0x00000080;
+ bitField0_ |= 0x00000100;
}
} else {
input.skipUnknownField();
@@ -942,6 +1024,19 @@ public final class SceneEntityInfoOuterClass {
}
break;
}
+ case 80492037:
+ case -1790265822: {
+ if (input.isAtField(FieldNames.summonUnit)) {
+ if (!input.trySkipNullValue()) {
+ clearEntityCaseOtherSummonUnit();
+ input.readMessage(summonUnit);
+ bitField0_ |= 0x00000010;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
default: {
input.skipUnknownField();
break;
@@ -1010,6 +1105,8 @@ public final class SceneEntityInfoOuterClass {
static final FieldName prop = FieldName.forField("prop");
static final FieldName actor = FieldName.forField("actor");
+
+ static final FieldName summonUnit = FieldName.forField("summonUnit", "summon_unit");
}
}
}
diff --git a/src/generated/main/emu/lunarcore/proto/SceneSummonUnitInfoOuterClass.java b/src/generated/main/emu/lunarcore/proto/SceneSummonUnitInfoOuterClass.java
new file mode 100644
index 0000000..12798d1
--- /dev/null
+++ b/src/generated/main/emu/lunarcore/proto/SceneSummonUnitInfoOuterClass.java
@@ -0,0 +1,699 @@
+// Code generated by protocol buffer compiler. Do not edit!
+package emu.lunarcore.proto;
+
+import java.io.IOException;
+import us.hebi.quickbuf.FieldName;
+import us.hebi.quickbuf.InvalidProtocolBufferException;
+import us.hebi.quickbuf.JsonSink;
+import us.hebi.quickbuf.JsonSource;
+import us.hebi.quickbuf.MessageFactory;
+import us.hebi.quickbuf.ProtoMessage;
+import us.hebi.quickbuf.ProtoSink;
+import us.hebi.quickbuf.ProtoSource;
+import us.hebi.quickbuf.RepeatedString;
+
+public final class SceneSummonUnitInfoOuterClass {
+ /**
+ * Protobuf type {@code SceneSummonUnitInfo}
+ */
+ public static final class SceneSummonUnitInfo extends ProtoMessage implements Cloneable {
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * optional uint64 create_time_ms = 14;
+ */
+ private long createTimeMs;
+
+ /**
+ * optional int32 life_time_ms = 6;
+ */
+ private int lifeTimeMs;
+
+ /**
+ * optional uint32 caster_entity_id = 11;
+ */
+ private int casterEntityId;
+
+ /**
+ * optional uint32 attach_entity_id = 12;
+ */
+ private int attachEntityId;
+
+ /**
+ * optional uint32 summon_unit_id = 13;
+ */
+ private int summonUnitId;
+
+ /**
+ * repeated string custom_triggers = 3;
+ */
+ private final RepeatedString customTriggers = RepeatedString.newEmptyInstance();
+
+ private SceneSummonUnitInfo() {
+ }
+
+ /**
+ * @return a new empty instance of {@code SceneSummonUnitInfo}
+ */
+ public static SceneSummonUnitInfo newInstance() {
+ return new SceneSummonUnitInfo();
+ }
+
+ /**
+ * optional uint64 create_time_ms = 14;
+ * @return whether the createTimeMs field is set
+ */
+ public boolean hasCreateTimeMs() {
+ return (bitField0_ & 0x00000001) != 0;
+ }
+
+ /**
+ * optional uint64 create_time_ms = 14;
+ * @return this
+ */
+ public SceneSummonUnitInfo clearCreateTimeMs() {
+ bitField0_ &= ~0x00000001;
+ createTimeMs = 0L;
+ return this;
+ }
+
+ /**
+ * optional uint64 create_time_ms = 14;
+ * @return the createTimeMs
+ */
+ public long getCreateTimeMs() {
+ return createTimeMs;
+ }
+
+ /**
+ * optional uint64 create_time_ms = 14;
+ * @param value the createTimeMs to set
+ * @return this
+ */
+ public SceneSummonUnitInfo setCreateTimeMs(final long value) {
+ bitField0_ |= 0x00000001;
+ createTimeMs = value;
+ return this;
+ }
+
+ /**
+ * optional int32 life_time_ms = 6;
+ * @return whether the lifeTimeMs field is set
+ */
+ public boolean hasLifeTimeMs() {
+ return (bitField0_ & 0x00000002) != 0;
+ }
+
+ /**
+ * optional int32 life_time_ms = 6;
+ * @return this
+ */
+ public SceneSummonUnitInfo clearLifeTimeMs() {
+ bitField0_ &= ~0x00000002;
+ lifeTimeMs = 0;
+ return this;
+ }
+
+ /**
+ * optional int32 life_time_ms = 6;
+ * @return the lifeTimeMs
+ */
+ public int getLifeTimeMs() {
+ return lifeTimeMs;
+ }
+
+ /**
+ * optional int32 life_time_ms = 6;
+ * @param value the lifeTimeMs to set
+ * @return this
+ */
+ public SceneSummonUnitInfo setLifeTimeMs(final int value) {
+ bitField0_ |= 0x00000002;
+ lifeTimeMs = value;
+ return this;
+ }
+
+ /**
+ * optional uint32 caster_entity_id = 11;
+ * @return whether the casterEntityId field is set
+ */
+ public boolean hasCasterEntityId() {
+ return (bitField0_ & 0x00000004) != 0;
+ }
+
+ /**
+ * optional uint32 caster_entity_id = 11;
+ * @return this
+ */
+ public SceneSummonUnitInfo clearCasterEntityId() {
+ bitField0_ &= ~0x00000004;
+ casterEntityId = 0;
+ return this;
+ }
+
+ /**
+ * optional uint32 caster_entity_id = 11;
+ * @return the casterEntityId
+ */
+ public int getCasterEntityId() {
+ return casterEntityId;
+ }
+
+ /**
+ * optional uint32 caster_entity_id = 11;
+ * @param value the casterEntityId to set
+ * @return this
+ */
+ public SceneSummonUnitInfo setCasterEntityId(final int value) {
+ bitField0_ |= 0x00000004;
+ casterEntityId = value;
+ return this;
+ }
+
+ /**
+ * optional uint32 attach_entity_id = 12;
+ * @return whether the attachEntityId field is set
+ */
+ public boolean hasAttachEntityId() {
+ return (bitField0_ & 0x00000008) != 0;
+ }
+
+ /**
+ * optional uint32 attach_entity_id = 12;
+ * @return this
+ */
+ public SceneSummonUnitInfo clearAttachEntityId() {
+ bitField0_ &= ~0x00000008;
+ attachEntityId = 0;
+ return this;
+ }
+
+ /**
+ * optional uint32 attach_entity_id = 12;
+ * @return the attachEntityId
+ */
+ public int getAttachEntityId() {
+ return attachEntityId;
+ }
+
+ /**
+ * optional uint32 attach_entity_id = 12;
+ * @param value the attachEntityId to set
+ * @return this
+ */
+ public SceneSummonUnitInfo setAttachEntityId(final int value) {
+ bitField0_ |= 0x00000008;
+ attachEntityId = value;
+ return this;
+ }
+
+ /**
+ * optional uint32 summon_unit_id = 13;
+ * @return whether the summonUnitId field is set
+ */
+ public boolean hasSummonUnitId() {
+ return (bitField0_ & 0x00000010) != 0;
+ }
+
+ /**
+ * optional uint32 summon_unit_id = 13;
+ * @return this
+ */
+ public SceneSummonUnitInfo clearSummonUnitId() {
+ bitField0_ &= ~0x00000010;
+ summonUnitId = 0;
+ return this;
+ }
+
+ /**
+ * optional uint32 summon_unit_id = 13;
+ * @return the summonUnitId
+ */
+ public int getSummonUnitId() {
+ return summonUnitId;
+ }
+
+ /**
+ * optional uint32 summon_unit_id = 13;
+ * @param value the summonUnitId to set
+ * @return this
+ */
+ public SceneSummonUnitInfo setSummonUnitId(final int value) {
+ bitField0_ |= 0x00000010;
+ summonUnitId = value;
+ return this;
+ }
+
+ /**
+ * repeated string custom_triggers = 3;
+ * @return whether the customTriggers field is set
+ */
+ public boolean hasCustomTriggers() {
+ return (bitField0_ & 0x00000020) != 0;
+ }
+
+ /**
+ * repeated string custom_triggers = 3;
+ * @return this
+ */
+ public SceneSummonUnitInfo clearCustomTriggers() {
+ bitField0_ &= ~0x00000020;
+ customTriggers.clear();
+ return this;
+ }
+
+ /**
+ * repeated string custom_triggers = 3;
+ *
+ * This method returns the internal storage object without modifying any has state.
+ * The returned object should not be modified and be treated as read-only.
+ *
+ * Use {@link #getMutableCustomTriggers()} if you want to modify it.
+ *
+ * @return internal storage object for reading
+ */
+ public RepeatedString getCustomTriggers() {
+ return customTriggers;
+ }
+
+ /**
+ * repeated string custom_triggers = 3;
+ *
+ * This method returns the internal storage object and sets the corresponding
+ * has state. The returned object will become part of this message and its
+ * contents may be modified as long as the has state is not cleared.
+ *
+ * @return internal storage object for modifications
+ */
+ public RepeatedString getMutableCustomTriggers() {
+ bitField0_ |= 0x00000020;
+ return customTriggers;
+ }
+
+ /**
+ * repeated string custom_triggers = 3;
+ * @param value the customTriggers to add
+ * @return this
+ */
+ public SceneSummonUnitInfo addCustomTriggers(final CharSequence value) {
+ bitField0_ |= 0x00000020;
+ customTriggers.add(value);
+ return this;
+ }
+
+ /**
+ * repeated string custom_triggers = 3;
+ * @param values the customTriggers to add
+ * @return this
+ */
+ public SceneSummonUnitInfo addAllCustomTriggers(final CharSequence... values) {
+ bitField0_ |= 0x00000020;
+ customTriggers.addAll(values);
+ return this;
+ }
+
+ @Override
+ public SceneSummonUnitInfo copyFrom(final SceneSummonUnitInfo other) {
+ cachedSize = other.cachedSize;
+ if ((bitField0_ | other.bitField0_) != 0) {
+ bitField0_ = other.bitField0_;
+ createTimeMs = other.createTimeMs;
+ lifeTimeMs = other.lifeTimeMs;
+ casterEntityId = other.casterEntityId;
+ attachEntityId = other.attachEntityId;
+ summonUnitId = other.summonUnitId;
+ customTriggers.copyFrom(other.customTriggers);
+ }
+ return this;
+ }
+
+ @Override
+ public SceneSummonUnitInfo mergeFrom(final SceneSummonUnitInfo other) {
+ if (other.isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ if (other.hasCreateTimeMs()) {
+ setCreateTimeMs(other.createTimeMs);
+ }
+ if (other.hasLifeTimeMs()) {
+ setLifeTimeMs(other.lifeTimeMs);
+ }
+ if (other.hasCasterEntityId()) {
+ setCasterEntityId(other.casterEntityId);
+ }
+ if (other.hasAttachEntityId()) {
+ setAttachEntityId(other.attachEntityId);
+ }
+ if (other.hasSummonUnitId()) {
+ setSummonUnitId(other.summonUnitId);
+ }
+ if (other.hasCustomTriggers()) {
+ getMutableCustomTriggers().addAll(other.customTriggers);
+ }
+ return this;
+ }
+
+ @Override
+ public SceneSummonUnitInfo clear() {
+ if (isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ bitField0_ = 0;
+ createTimeMs = 0L;
+ lifeTimeMs = 0;
+ casterEntityId = 0;
+ attachEntityId = 0;
+ summonUnitId = 0;
+ customTriggers.clear();
+ return this;
+ }
+
+ @Override
+ public SceneSummonUnitInfo clearQuick() {
+ if (isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ bitField0_ = 0;
+ customTriggers.clear();
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof SceneSummonUnitInfo)) {
+ return false;
+ }
+ SceneSummonUnitInfo other = (SceneSummonUnitInfo) o;
+ return bitField0_ == other.bitField0_
+ && (!hasCreateTimeMs() || createTimeMs == other.createTimeMs)
+ && (!hasLifeTimeMs() || lifeTimeMs == other.lifeTimeMs)
+ && (!hasCasterEntityId() || casterEntityId == other.casterEntityId)
+ && (!hasAttachEntityId() || attachEntityId == other.attachEntityId)
+ && (!hasSummonUnitId() || summonUnitId == other.summonUnitId)
+ && (!hasCustomTriggers() || customTriggers.equals(other.customTriggers));
+ }
+
+ @Override
+ public void writeTo(final ProtoSink output) throws IOException {
+ if ((bitField0_ & 0x00000001) != 0) {
+ output.writeRawByte((byte) 112);
+ output.writeUInt64NoTag(createTimeMs);
+ }
+ if ((bitField0_ & 0x00000002) != 0) {
+ output.writeRawByte((byte) 48);
+ output.writeInt32NoTag(lifeTimeMs);
+ }
+ if ((bitField0_ & 0x00000004) != 0) {
+ output.writeRawByte((byte) 88);
+ output.writeUInt32NoTag(casterEntityId);
+ }
+ if ((bitField0_ & 0x00000008) != 0) {
+ output.writeRawByte((byte) 96);
+ output.writeUInt32NoTag(attachEntityId);
+ }
+ if ((bitField0_ & 0x00000010) != 0) {
+ output.writeRawByte((byte) 104);
+ output.writeUInt32NoTag(summonUnitId);
+ }
+ if ((bitField0_ & 0x00000020) != 0) {
+ for (int i = 0; i < customTriggers.length(); i++) {
+ output.writeRawByte((byte) 26);
+ output.writeStringNoTag(customTriggers.get(i));
+ }
+ }
+ }
+
+ @Override
+ protected int computeSerializedSize() {
+ int size = 0;
+ if ((bitField0_ & 0x00000001) != 0) {
+ size += 1 + ProtoSink.computeUInt64SizeNoTag(createTimeMs);
+ }
+ if ((bitField0_ & 0x00000002) != 0) {
+ size += 1 + ProtoSink.computeInt32SizeNoTag(lifeTimeMs);
+ }
+ if ((bitField0_ & 0x00000004) != 0) {
+ size += 1 + ProtoSink.computeUInt32SizeNoTag(casterEntityId);
+ }
+ if ((bitField0_ & 0x00000008) != 0) {
+ size += 1 + ProtoSink.computeUInt32SizeNoTag(attachEntityId);
+ }
+ if ((bitField0_ & 0x00000010) != 0) {
+ size += 1 + ProtoSink.computeUInt32SizeNoTag(summonUnitId);
+ }
+ if ((bitField0_ & 0x00000020) != 0) {
+ size += (1 * customTriggers.length()) + ProtoSink.computeRepeatedStringSizeNoTag(customTriggers);
+ }
+ return size;
+ }
+
+ @Override
+ @SuppressWarnings("fallthrough")
+ public SceneSummonUnitInfo mergeFrom(final ProtoSource input) throws IOException {
+ // Enabled Fall-Through Optimization (QuickBuffers)
+ int tag = input.readTag();
+ while (true) {
+ switch (tag) {
+ case 112: {
+ // createTimeMs
+ createTimeMs = input.readUInt64();
+ bitField0_ |= 0x00000001;
+ tag = input.readTag();
+ if (tag != 48) {
+ break;
+ }
+ }
+ case 48: {
+ // lifeTimeMs
+ lifeTimeMs = input.readInt32();
+ bitField0_ |= 0x00000002;
+ tag = input.readTag();
+ if (tag != 88) {
+ break;
+ }
+ }
+ case 88: {
+ // casterEntityId
+ casterEntityId = input.readUInt32();
+ bitField0_ |= 0x00000004;
+ tag = input.readTag();
+ if (tag != 96) {
+ break;
+ }
+ }
+ case 96: {
+ // attachEntityId
+ attachEntityId = input.readUInt32();
+ bitField0_ |= 0x00000008;
+ tag = input.readTag();
+ if (tag != 104) {
+ break;
+ }
+ }
+ case 104: {
+ // summonUnitId
+ summonUnitId = input.readUInt32();
+ bitField0_ |= 0x00000010;
+ tag = input.readTag();
+ if (tag != 26) {
+ break;
+ }
+ }
+ case 26: {
+ // customTriggers
+ tag = input.readRepeatedString(customTriggers, tag);
+ bitField0_ |= 0x00000020;
+ if (tag != 0) {
+ break;
+ }
+ }
+ case 0: {
+ return this;
+ }
+ default: {
+ if (!input.skipField(tag)) {
+ return this;
+ }
+ tag = input.readTag();
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void writeTo(final JsonSink output) throws IOException {
+ output.beginObject();
+ if ((bitField0_ & 0x00000001) != 0) {
+ output.writeUInt64(FieldNames.createTimeMs, createTimeMs);
+ }
+ if ((bitField0_ & 0x00000002) != 0) {
+ output.writeInt32(FieldNames.lifeTimeMs, lifeTimeMs);
+ }
+ if ((bitField0_ & 0x00000004) != 0) {
+ output.writeUInt32(FieldNames.casterEntityId, casterEntityId);
+ }
+ if ((bitField0_ & 0x00000008) != 0) {
+ output.writeUInt32(FieldNames.attachEntityId, attachEntityId);
+ }
+ if ((bitField0_ & 0x00000010) != 0) {
+ output.writeUInt32(FieldNames.summonUnitId, summonUnitId);
+ }
+ if ((bitField0_ & 0x00000020) != 0) {
+ output.writeRepeatedString(FieldNames.customTriggers, customTriggers);
+ }
+ output.endObject();
+ }
+
+ @Override
+ public SceneSummonUnitInfo mergeFrom(final JsonSource input) throws IOException {
+ if (!input.beginObject()) {
+ return this;
+ }
+ while (!input.isAtEnd()) {
+ switch (input.readFieldHash()) {
+ case 1554103663:
+ case 1902222357: {
+ if (input.isAtField(FieldNames.createTimeMs)) {
+ if (!input.trySkipNullValue()) {
+ createTimeMs = input.readUInt64();
+ bitField0_ |= 0x00000001;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ case -1226028177:
+ case 1665182229: {
+ if (input.isAtField(FieldNames.lifeTimeMs)) {
+ if (!input.trySkipNullValue()) {
+ lifeTimeMs = input.readInt32();
+ bitField0_ |= 0x00000002;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ case -1831162710:
+ case -1550367068: {
+ if (input.isAtField(FieldNames.casterEntityId)) {
+ if (!input.trySkipNullValue()) {
+ casterEntityId = input.readUInt32();
+ bitField0_ |= 0x00000004;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ case -900612669:
+ case -644975235: {
+ if (input.isAtField(FieldNames.attachEntityId)) {
+ if (!input.trySkipNullValue()) {
+ attachEntityId = input.readUInt32();
+ bitField0_ |= 0x00000008;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ case 43438592:
+ case 1094873176: {
+ if (input.isAtField(FieldNames.summonUnitId)) {
+ if (!input.trySkipNullValue()) {
+ summonUnitId = input.readUInt32();
+ bitField0_ |= 0x00000010;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ case -1316859828:
+ case -1929554231: {
+ if (input.isAtField(FieldNames.customTriggers)) {
+ if (!input.trySkipNullValue()) {
+ input.readRepeatedString(customTriggers);
+ bitField0_ |= 0x00000020;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ default: {
+ input.skipUnknownField();
+ break;
+ }
+ }
+ }
+ input.endObject();
+ return this;
+ }
+
+ @Override
+ public SceneSummonUnitInfo clone() {
+ return new SceneSummonUnitInfo().copyFrom(this);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return ((bitField0_) == 0);
+ }
+
+ public static SceneSummonUnitInfo parseFrom(final byte[] data) throws
+ InvalidProtocolBufferException {
+ return ProtoMessage.mergeFrom(new SceneSummonUnitInfo(), data).checkInitialized();
+ }
+
+ public static SceneSummonUnitInfo parseFrom(final ProtoSource input) throws IOException {
+ return ProtoMessage.mergeFrom(new SceneSummonUnitInfo(), input).checkInitialized();
+ }
+
+ public static SceneSummonUnitInfo parseFrom(final JsonSource input) throws IOException {
+ return ProtoMessage.mergeFrom(new SceneSummonUnitInfo(), input).checkInitialized();
+ }
+
+ /**
+ * @return factory for creating SceneSummonUnitInfo messages
+ */
+ public static MessageFactory getFactory() {
+ return SceneSummonUnitInfoFactory.INSTANCE;
+ }
+
+ private enum SceneSummonUnitInfoFactory implements MessageFactory {
+ INSTANCE;
+
+ @Override
+ public SceneSummonUnitInfo create() {
+ return SceneSummonUnitInfo.newInstance();
+ }
+ }
+
+ /**
+ * Contains name constants used for serializing JSON
+ */
+ static class FieldNames {
+ static final FieldName createTimeMs = FieldName.forField("createTimeMs", "create_time_ms");
+
+ static final FieldName lifeTimeMs = FieldName.forField("lifeTimeMs", "life_time_ms");
+
+ static final FieldName casterEntityId = FieldName.forField("casterEntityId", "caster_entity_id");
+
+ static final FieldName attachEntityId = FieldName.forField("attachEntityId", "attach_entity_id");
+
+ static final FieldName summonUnitId = FieldName.forField("summonUnitId", "summon_unit_id");
+
+ static final FieldName customTriggers = FieldName.forField("customTriggers", "custom_triggers");
+ }
+ }
+}
diff --git a/src/generated/main/emu/lunarcore/proto/SyncEntityBuffChangeListScNotifyOuterClass.java b/src/generated/main/emu/lunarcore/proto/SyncEntityBuffChangeListScNotifyOuterClass.java
new file mode 100644
index 0000000..57c75d0
--- /dev/null
+++ b/src/generated/main/emu/lunarcore/proto/SyncEntityBuffChangeListScNotifyOuterClass.java
@@ -0,0 +1,301 @@
+// Code generated by protocol buffer compiler. Do not edit!
+package emu.lunarcore.proto;
+
+import java.io.IOException;
+import us.hebi.quickbuf.FieldName;
+import us.hebi.quickbuf.InvalidProtocolBufferException;
+import us.hebi.quickbuf.JsonSink;
+import us.hebi.quickbuf.JsonSource;
+import us.hebi.quickbuf.MessageFactory;
+import us.hebi.quickbuf.ProtoMessage;
+import us.hebi.quickbuf.ProtoSink;
+import us.hebi.quickbuf.ProtoSource;
+import us.hebi.quickbuf.RepeatedMessage;
+
+public final class SyncEntityBuffChangeListScNotifyOuterClass {
+ /**
+ * Protobuf type {@code SyncEntityBuffChangeListScNotify}
+ */
+ public static final class SyncEntityBuffChangeListScNotify extends ProtoMessage implements Cloneable {
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * repeated .EntityBuffChangeInfo entity_buff_info_list = 5;
+ */
+ private final RepeatedMessage entityBuffInfoList = RepeatedMessage.newEmptyInstance(EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo.getFactory());
+
+ private SyncEntityBuffChangeListScNotify() {
+ }
+
+ /**
+ * @return a new empty instance of {@code SyncEntityBuffChangeListScNotify}
+ */
+ public static SyncEntityBuffChangeListScNotify newInstance() {
+ return new SyncEntityBuffChangeListScNotify();
+ }
+
+ /**
+ * repeated .EntityBuffChangeInfo entity_buff_info_list = 5;
+ * @return whether the entityBuffInfoList field is set
+ */
+ public boolean hasEntityBuffInfoList() {
+ return (bitField0_ & 0x00000001) != 0;
+ }
+
+ /**
+ * repeated .EntityBuffChangeInfo entity_buff_info_list = 5;
+ * @return this
+ */
+ public SyncEntityBuffChangeListScNotify clearEntityBuffInfoList() {
+ bitField0_ &= ~0x00000001;
+ entityBuffInfoList.clear();
+ return this;
+ }
+
+ /**
+ * repeated .EntityBuffChangeInfo entity_buff_info_list = 5;
+ *
+ * This method returns the internal storage object without modifying any has state.
+ * The returned object should not be modified and be treated as read-only.
+ *
+ * Use {@link #getMutableEntityBuffInfoList()} if you want to modify it.
+ *
+ * @return internal storage object for reading
+ */
+ public RepeatedMessage getEntityBuffInfoList(
+ ) {
+ return entityBuffInfoList;
+ }
+
+ /**
+ * repeated .EntityBuffChangeInfo entity_buff_info_list = 5;
+ *
+ * This method returns the internal storage object and sets the corresponding
+ * has state. The returned object will become part of this message and its
+ * contents may be modified as long as the has state is not cleared.
+ *
+ * @return internal storage object for modifications
+ */
+ public RepeatedMessage getMutableEntityBuffInfoList(
+ ) {
+ bitField0_ |= 0x00000001;
+ return entityBuffInfoList;
+ }
+
+ /**
+ * repeated .EntityBuffChangeInfo entity_buff_info_list = 5;
+ * @param value the entityBuffInfoList to add
+ * @return this
+ */
+ public SyncEntityBuffChangeListScNotify addEntityBuffInfoList(
+ final EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo value) {
+ bitField0_ |= 0x00000001;
+ entityBuffInfoList.add(value);
+ return this;
+ }
+
+ /**
+ * repeated .EntityBuffChangeInfo entity_buff_info_list = 5;
+ * @param values the entityBuffInfoList to add
+ * @return this
+ */
+ public SyncEntityBuffChangeListScNotify addAllEntityBuffInfoList(
+ final EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo... values) {
+ bitField0_ |= 0x00000001;
+ entityBuffInfoList.addAll(values);
+ return this;
+ }
+
+ @Override
+ public SyncEntityBuffChangeListScNotify copyFrom(final SyncEntityBuffChangeListScNotify other) {
+ cachedSize = other.cachedSize;
+ if ((bitField0_ | other.bitField0_) != 0) {
+ bitField0_ = other.bitField0_;
+ entityBuffInfoList.copyFrom(other.entityBuffInfoList);
+ }
+ return this;
+ }
+
+ @Override
+ public SyncEntityBuffChangeListScNotify mergeFrom(
+ final SyncEntityBuffChangeListScNotify other) {
+ if (other.isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ if (other.hasEntityBuffInfoList()) {
+ getMutableEntityBuffInfoList().addAll(other.entityBuffInfoList);
+ }
+ return this;
+ }
+
+ @Override
+ public SyncEntityBuffChangeListScNotify clear() {
+ if (isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ bitField0_ = 0;
+ entityBuffInfoList.clear();
+ return this;
+ }
+
+ @Override
+ public SyncEntityBuffChangeListScNotify clearQuick() {
+ if (isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ bitField0_ = 0;
+ entityBuffInfoList.clearQuick();
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof SyncEntityBuffChangeListScNotify)) {
+ return false;
+ }
+ SyncEntityBuffChangeListScNotify other = (SyncEntityBuffChangeListScNotify) o;
+ return bitField0_ == other.bitField0_
+ && (!hasEntityBuffInfoList() || entityBuffInfoList.equals(other.entityBuffInfoList));
+ }
+
+ @Override
+ public void writeTo(final ProtoSink output) throws IOException {
+ if ((bitField0_ & 0x00000001) != 0) {
+ for (int i = 0; i < entityBuffInfoList.length(); i++) {
+ output.writeRawByte((byte) 42);
+ output.writeMessageNoTag(entityBuffInfoList.get(i));
+ }
+ }
+ }
+
+ @Override
+ protected int computeSerializedSize() {
+ int size = 0;
+ if ((bitField0_ & 0x00000001) != 0) {
+ size += (1 * entityBuffInfoList.length()) + ProtoSink.computeRepeatedMessageSizeNoTag(entityBuffInfoList);
+ }
+ return size;
+ }
+
+ @Override
+ @SuppressWarnings("fallthrough")
+ public SyncEntityBuffChangeListScNotify mergeFrom(final ProtoSource input) throws IOException {
+ // Enabled Fall-Through Optimization (QuickBuffers)
+ int tag = input.readTag();
+ while (true) {
+ switch (tag) {
+ case 42: {
+ // entityBuffInfoList
+ tag = input.readRepeatedMessage(entityBuffInfoList, tag);
+ bitField0_ |= 0x00000001;
+ if (tag != 0) {
+ break;
+ }
+ }
+ case 0: {
+ return this;
+ }
+ default: {
+ if (!input.skipField(tag)) {
+ return this;
+ }
+ tag = input.readTag();
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void writeTo(final JsonSink output) throws IOException {
+ output.beginObject();
+ if ((bitField0_ & 0x00000001) != 0) {
+ output.writeRepeatedMessage(FieldNames.entityBuffInfoList, entityBuffInfoList);
+ }
+ output.endObject();
+ }
+
+ @Override
+ public SyncEntityBuffChangeListScNotify mergeFrom(final JsonSource input) throws IOException {
+ if (!input.beginObject()) {
+ return this;
+ }
+ while (!input.isAtEnd()) {
+ switch (input.readFieldHash()) {
+ case -614748318:
+ case -1583683457: {
+ if (input.isAtField(FieldNames.entityBuffInfoList)) {
+ if (!input.trySkipNullValue()) {
+ input.readRepeatedMessage(entityBuffInfoList);
+ bitField0_ |= 0x00000001;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ default: {
+ input.skipUnknownField();
+ break;
+ }
+ }
+ }
+ input.endObject();
+ return this;
+ }
+
+ @Override
+ public SyncEntityBuffChangeListScNotify clone() {
+ return new SyncEntityBuffChangeListScNotify().copyFrom(this);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return ((bitField0_) == 0);
+ }
+
+ public static SyncEntityBuffChangeListScNotify parseFrom(final byte[] data) throws
+ InvalidProtocolBufferException {
+ return ProtoMessage.mergeFrom(new SyncEntityBuffChangeListScNotify(), data).checkInitialized();
+ }
+
+ public static SyncEntityBuffChangeListScNotify parseFrom(final ProtoSource input) throws
+ IOException {
+ return ProtoMessage.mergeFrom(new SyncEntityBuffChangeListScNotify(), input).checkInitialized();
+ }
+
+ public static SyncEntityBuffChangeListScNotify parseFrom(final JsonSource input) throws
+ IOException {
+ return ProtoMessage.mergeFrom(new SyncEntityBuffChangeListScNotify(), input).checkInitialized();
+ }
+
+ /**
+ * @return factory for creating SyncEntityBuffChangeListScNotify messages
+ */
+ public static MessageFactory getFactory() {
+ return SyncEntityBuffChangeListScNotifyFactory.INSTANCE;
+ }
+
+ private enum SyncEntityBuffChangeListScNotifyFactory implements MessageFactory {
+ INSTANCE;
+
+ @Override
+ public SyncEntityBuffChangeListScNotify create() {
+ return SyncEntityBuffChangeListScNotify.newInstance();
+ }
+ }
+
+ /**
+ * Contains name constants used for serializing JSON
+ */
+ static class FieldNames {
+ static final FieldName entityBuffInfoList = FieldName.forField("entityBuffInfoList", "entity_buff_info_list");
+ }
+ }
+}
diff --git a/src/main/java/emu/lunarcore/data/GameData.java b/src/main/java/emu/lunarcore/data/GameData.java
index 49808d6..013bbbe 100644
--- a/src/main/java/emu/lunarcore/data/GameData.java
+++ b/src/main/java/emu/lunarcore/data/GameData.java
@@ -24,6 +24,7 @@ public class GameData {
@Getter private static Int2ObjectMap relicExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap propExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap npcExcelMap = new Int2ObjectOpenHashMap<>();
+ @Getter private static Int2ObjectMap summonUnitExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap monsterExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap npcMonsterExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap stageExcelMap = new Int2ObjectOpenHashMap<>();
diff --git a/src/main/java/emu/lunarcore/data/ResourceLoader.java b/src/main/java/emu/lunarcore/data/ResourceLoader.java
index 8589570..ddde973 100644
--- a/src/main/java/emu/lunarcore/data/ResourceLoader.java
+++ b/src/main/java/emu/lunarcore/data/ResourceLoader.java
@@ -21,6 +21,7 @@ import emu.lunarcore.data.config.FloorInfo;
import emu.lunarcore.data.config.FloorInfo.FloorGroupSimpleInfo;
import emu.lunarcore.data.config.GroupInfo;
import emu.lunarcore.data.config.SkillAbilityInfo;
+import emu.lunarcore.data.config.SummonUnitInfo;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
public class ResourceLoader {
@@ -227,8 +228,40 @@ public class ResourceLoader {
// Might be better to cache
private static void loadMazeAbilities() {
+ // Loaded configs count
int count = 0;
+
+ // Load summon unit configs
+ for (var summonUnitExcel : GameData.getSummonUnitExcelMap().values()) {
+ if (summonUnitExcel.isIsClient()) {
+ count++;
+ continue;
+ }
+
+ // Get file
+ File file = new File(LunarCore.getConfig().getResourceDir() + "/" + summonUnitExcel.getJsonPath());
+ if (!file.exists()) continue;
+
+ try (FileReader reader = new FileReader(file)) {
+ SummonUnitInfo info = gson.fromJson(reader, SummonUnitInfo.class);
+ info.buildMazeSkillActions();
+
+ summonUnitExcel.setInfo(info);
+ count++;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Notify the server owner if we are missing any files
+ if (count < GameData.getSummonUnitExcelMap().size()) {
+ LunarCore.getLogger().warn("Summon unit configs are missing, please check your resources folder: {resources}/Config/ConfigSummonUnit. Character summon techniques may not work!");
+ }
+
+ // Reset loaded count
+ count = 0;
+ // Load maze abilities
for (var avatarExcel : GameData.getAvatarExcelMap().values()) {
// Get file
File file = new File(LunarCore.getConfig().getResourceDir() + "/Config/ConfigAdventureAbility/LocalPlayer/LocalPlayer_" + avatarExcel.getNameKey() + "_Ability.json");
diff --git a/src/main/java/emu/lunarcore/data/config/SkillAbilityInfo.java b/src/main/java/emu/lunarcore/data/config/SkillAbilityInfo.java
index 9617abf..151c88f 100644
--- a/src/main/java/emu/lunarcore/data/config/SkillAbilityInfo.java
+++ b/src/main/java/emu/lunarcore/data/config/SkillAbilityInfo.java
@@ -2,6 +2,7 @@ package emu.lunarcore.data.config;
import java.util.List;
+import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.AvatarExcel;
import emu.lunarcore.game.battle.skills.*;
import lombok.Getter;
@@ -27,6 +28,13 @@ public class SkillAbilityInfo {
avatarExcel.setMazeSkill(skill);
actionList = skill.getCastActions();
+
+ // Hacky way to check if an avatar can summon with their skill
+ var summonUnitExcel = GameData.getSummonUnitExcelMap().get((skill.getId() * 10) + 1);
+ if (summonUnitExcel != null && !summonUnitExcel.isIsClient()) {
+ // TODO duration is hardcoded
+ skill.getCastActions().add(new MazeSkillSummonUnit(summonUnitExcel, 20));
+ }
} else if (ability.getName().contains("NormalAtk")) {
skill = new MazeSkill(avatarExcel, 0);
avatarExcel.setMazeAttack(skill);
@@ -46,6 +54,7 @@ public class SkillAbilityInfo {
}
// "Simple" way to parse maze attacks/skills
+ // TODO parse tasks better
private void parseTask(MazeSkill skill, List actionList, TaskInfo task) {
if (task.getType().contains("AddMazeBuff")) {
// TODO get duration from params if buff duration is dynamic
@@ -59,7 +68,7 @@ public class SkillAbilityInfo {
// TODO get sp increase value from params, also handle target alias
actionList.add(new MazeSkillModifySP(50));
} else if (task.getType().contains("CreateSummonUnit")) {
-
+ // Ignored
} else if (task.getSuccessTaskList() != null) {
for (TaskInfo t : task.getSuccessTaskList()) {
parseTask(skill, actionList, t);
diff --git a/src/main/java/emu/lunarcore/data/config/SummonUnitInfo.java b/src/main/java/emu/lunarcore/data/config/SummonUnitInfo.java
new file mode 100644
index 0000000..cd465de
--- /dev/null
+++ b/src/main/java/emu/lunarcore/data/config/SummonUnitInfo.java
@@ -0,0 +1,75 @@
+package emu.lunarcore.data.config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import emu.lunarcore.game.battle.skills.MazeSkillAction;
+import emu.lunarcore.game.battle.skills.MazeSkillAddBuff;
+import lombok.Getter;
+
+/**
+ * Original name: SummonUnitConfig
+ */
+@Getter
+public class SummonUnitInfo {
+ private String AttachPoint;
+ private SummonUnitTriggers TriggerConfig;
+
+ public List getCustomTriggers() {
+ return TriggerConfig.getCustomTriggers();
+ }
+
+ public SummonUnitCustomTrigger getTriggerByName(String name) {
+ return getCustomTriggers().stream()
+ .filter(c -> c.getTriggerName().equals(name))
+ .findFirst()
+ .orElse(null);
+ }
+
+ public void buildMazeSkillActions() {
+ for (var customTrigger : getCustomTriggers()) {
+ customTrigger.buildMazeSkillActions();
+ }
+ }
+
+ /**
+ * Original name: SummonUnitTriggerConfig
+ */
+ @Getter
+ public static class SummonUnitTriggers {
+ private List CustomTriggers;
+ }
+
+ /**
+ * Original name: UnitCustomTriggerConfig
+ */
+ @Getter
+ public static class SummonUnitCustomTrigger {
+ private String TriggerName;
+ private List OnTriggerEnter;
+
+ private transient List actions;
+
+ public void buildMazeSkillActions() {
+ // Create actions list
+ this.actions = new ArrayList<>();
+
+ // Sanity check
+ if (this.OnTriggerEnter == null) return;
+
+ // Build maze actions
+ for (var task : this.OnTriggerEnter) {
+ if (task.getType().contains("AddMazeBuff")) {
+ // TODO get duration from params if buff duration is dynamic
+ var actionAddBuff = new MazeSkillAddBuff(task.getID(), 15);
+ actionAddBuff.setSendBuffPacket(true);
+
+ actions.add(actionAddBuff);
+ } else if (task.getType().contains("TriggerHitProp")) {
+ // actions.add(new MazeSkillAddBuff(task.getID(), 20));
+ }
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/emu/lunarcore/data/excel/SummonUnitExcel.java b/src/main/java/emu/lunarcore/data/excel/SummonUnitExcel.java
new file mode 100644
index 0000000..fb80fc2
--- /dev/null
+++ b/src/main/java/emu/lunarcore/data/excel/SummonUnitExcel.java
@@ -0,0 +1,28 @@
+package emu.lunarcore.data.excel;
+
+import emu.lunarcore.data.GameResource;
+import emu.lunarcore.data.ResourceType;
+import emu.lunarcore.data.config.SummonUnitInfo;
+import lombok.Getter;
+
+@Getter
+@ResourceType(name = {"SummonUnitData.json"})
+public class SummonUnitExcel extends GameResource {
+ private int ID;
+ private String JsonPath;
+ private boolean IsClient;
+
+ private transient SummonUnitInfo info;
+
+ @Override
+ public int getId() {
+ return ID;
+ }
+
+ public void setInfo(SummonUnitInfo info) {
+ if (this.info == null && !this.IsClient) {
+ this.info = info;
+ }
+ }
+
+}
diff --git a/src/main/java/emu/lunarcore/game/battle/BattleService.java b/src/main/java/emu/lunarcore/game/battle/BattleService.java
index 586c613..6715a08 100644
--- a/src/main/java/emu/lunarcore/game/battle/BattleService.java
+++ b/src/main/java/emu/lunarcore/game/battle/BattleService.java
@@ -80,9 +80,9 @@ public class BattleService extends BaseGameService {
if (entity instanceof EntityMonster monster) {
monsters.add(monster);
- } else if (entity instanceof EntityProp) {
+ } else if (entity instanceof EntityProp prop) {
it.remove();
- player.getScene().removeEntity(entity);
+ player.getScene().destroyProp(prop);
}
}
diff --git a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkill.java b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkill.java
index 240972a..677e7f3 100644
--- a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkill.java
+++ b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkill.java
@@ -6,7 +6,7 @@ import java.util.List;
import emu.lunarcore.data.excel.AvatarExcel;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
-import emu.lunarcore.game.scene.entity.EntityMonster;
+import emu.lunarcore.game.scene.entity.GameEntity;
import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
import lombok.Getter;
import lombok.Setter;
@@ -47,11 +47,11 @@ public class MazeSkill {
}
// Triggered when player attacks an enemy
- public void onAttack(GameAvatar caster, List monsters) {
+ public void onAttack(GameAvatar caster, List extends GameEntity> entities) {
if (this.getAttackActions().size() == 0) return;
for (var action : this.getAttackActions()) {
- action.onAttack(caster, monsters);
+ action.onAttack(caster, entities);
}
}
}
diff --git a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillAction.java b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillAction.java
index 195aa23..04eb62a 100644
--- a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillAction.java
+++ b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillAction.java
@@ -4,7 +4,7 @@ import java.util.List;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
-import emu.lunarcore.game.scene.entity.EntityMonster;
+import emu.lunarcore.game.scene.entity.GameEntity;
import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
public abstract class MazeSkillAction {
@@ -13,6 +13,6 @@ public abstract class MazeSkillAction {
public abstract void onAttack(GameAvatar caster, Battle battle);
- public abstract void onAttack(GameAvatar caster, List monsters);
+ public abstract void onAttack(GameAvatar caster, List extends GameEntity> entities);
}
diff --git a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillAddBuff.java b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillAddBuff.java
index 772922a..d193ca9 100644
--- a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillAddBuff.java
+++ b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillAddBuff.java
@@ -5,14 +5,20 @@ import java.util.List;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.scene.entity.EntityMonster;
+import emu.lunarcore.game.scene.entity.GameEntity;
import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
+import emu.lunarcore.server.packet.send.PacketSyncEntityBuffChangeListScNotify;
import lombok.Getter;
+import lombok.Setter;
@Getter
public class MazeSkillAddBuff extends MazeSkillAction {
private int buffId;
private int duration;
+ @Setter
+ private boolean sendBuffPacket;
+
public MazeSkillAddBuff(int buffId, int duration) {
this.buffId = buffId;
this.duration = duration;
@@ -34,9 +40,17 @@ public class MazeSkillAddBuff extends MazeSkillAction {
}
@Override
- public void onAttack(GameAvatar caster, List monsters) {
- for (EntityMonster monster : monsters) {
- monster.addBuff(caster.getAvatarId(), buffId, duration);
+ public void onAttack(GameAvatar caster, List extends GameEntity> entities) {
+ for (GameEntity entity : entities) {
+ if (entity instanceof EntityMonster monster) {
+ // Add buff to monster
+ var buff = monster.addBuff(caster.getAvatarId(), buffId, duration);
+
+ // Send packet
+ if (buff != null && this.sendBuffPacket) {
+ caster.getOwner().sendPacket(new PacketSyncEntityBuffChangeListScNotify(entity.getEntityId(), buff));
+ }
+ }
}
}
diff --git a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillHitProp.java b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillHitProp.java
new file mode 100644
index 0000000..7ebed06
--- /dev/null
+++ b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillHitProp.java
@@ -0,0 +1,34 @@
+package emu.lunarcore.game.battle.skills;
+
+import java.util.List;
+
+import emu.lunarcore.game.avatar.GameAvatar;
+import emu.lunarcore.game.battle.Battle;
+import emu.lunarcore.game.scene.entity.EntityProp;
+import emu.lunarcore.game.scene.entity.GameEntity;
+import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
+import lombok.Getter;
+
+@Getter
+public class MazeSkillHitProp extends MazeSkillAction {
+
+ @Override
+ public void onCast(GameAvatar caster, MotionInfo castPosition) {
+ // Skip
+ }
+
+ @Override
+ public void onAttack(GameAvatar caster, Battle battle) {
+ // Skip
+ }
+
+ @Override
+ public void onAttack(GameAvatar caster, List extends GameEntity> entities) {
+ for (GameEntity entity : entities) {
+ if (entity instanceof EntityProp prop) {
+ caster.getScene().destroyProp(prop);
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillModifyHP.java b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillModifyHP.java
index 7872a57..6747ef0 100644
--- a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillModifyHP.java
+++ b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillModifyHP.java
@@ -4,7 +4,7 @@ import java.util.List;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
-import emu.lunarcore.game.scene.entity.EntityMonster;
+import emu.lunarcore.game.scene.entity.GameEntity;
import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
public class MazeSkillModifyHP extends MazeSkillAction {
@@ -25,7 +25,7 @@ public class MazeSkillModifyHP extends MazeSkillAction {
}
@Override
- public void onAttack(GameAvatar caster, List monsters) {
+ public void onAttack(GameAvatar caster, List extends GameEntity> entities) {
}
diff --git a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillModifySP.java b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillModifySP.java
index 1e6e807..d1b754f 100644
--- a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillModifySP.java
+++ b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillModifySP.java
@@ -4,7 +4,7 @@ import java.util.List;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
-import emu.lunarcore.game.scene.entity.EntityMonster;
+import emu.lunarcore.game.scene.entity.GameEntity;
import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
public class MazeSkillModifySP extends MazeSkillAction {
@@ -28,7 +28,7 @@ public class MazeSkillModifySP extends MazeSkillAction {
}
@Override
- public void onAttack(GameAvatar caster, List monsters) {
+ public void onAttack(GameAvatar caster, List extends GameEntity> entities) {
}
diff --git a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillSummonUnit.java b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillSummonUnit.java
index ae9cdd8..3dfb1c0 100644
--- a/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillSummonUnit.java
+++ b/src/main/java/emu/lunarcore/game/battle/skills/MazeSkillSummonUnit.java
@@ -2,26 +2,37 @@ package emu.lunarcore.game.battle.skills;
import java.util.List;
+import emu.lunarcore.data.excel.SummonUnitExcel;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
-import emu.lunarcore.game.scene.entity.EntityMonster;
+import emu.lunarcore.game.scene.entity.GameEntity;
import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
+import emu.lunarcore.util.Position;
+import lombok.Getter;
+@Getter
public class MazeSkillSummonUnit extends MazeSkillAction {
+ private SummonUnitExcel excel;
+ private int duration;
+
+ public MazeSkillSummonUnit(SummonUnitExcel excel, int duration) {
+ this.excel = excel;
+ this.duration = duration;
+ }
@Override
public void onCast(GameAvatar caster, MotionInfo castPosition) {
- // TODO Auto-generated method stub
+ caster.getScene().summonUnit(caster, excel, new Position(castPosition.getPos()), new Position(castPosition.getRot()), duration);
}
@Override
public void onAttack(GameAvatar caster, Battle battle) {
- // TODO Auto-generated method stub
+ // Skip
}
@Override
- public void onAttack(GameAvatar caster, List monsters) {
- // TODO Auto-generated method stub
+ public void onAttack(GameAvatar caster, List extends GameEntity> entities) {
+ // Skip
}
}
diff --git a/src/main/java/emu/lunarcore/game/player/Player.java b/src/main/java/emu/lunarcore/game/player/Player.java
index 4481978..4e341cd 100644
--- a/src/main/java/emu/lunarcore/game/player/Player.java
+++ b/src/main/java/emu/lunarcore/game/player/Player.java
@@ -274,9 +274,16 @@ public class Player {
}
public void setWorldLevel(int level) {
+ if (this.worldLevel == level) {
+ return;
+ }
+
this.worldLevel = level;
- this.save();
- this.sendPacket(new PacketPlayerSyncScNotify(this));
+
+ if (this.isOnline()) {
+ this.save();
+ this.getSession().send(new PacketPlayerSyncScNotify(this));
+ }
}
public int getWorldLevel() {
@@ -470,7 +477,12 @@ public class Player {
}
public void setBattle(Battle battle) {
+ // Set battle first
this.battle = battle;
+ // Scene handler
+ if (this.getScene() != null) {
+ this.getScene().onBattleStart(battle);
+ }
}
public void forceQuitBattle() {
@@ -572,7 +584,7 @@ public class Player {
// Finish puzzle
prop.setState(PropState.Locked);
// Trigger event
- this.getScene().invokeTrigger(PropTriggerType.PUZZLE_FINISH, prop.getGroupId(), prop.getInstId());
+ this.getScene().invokePropTrigger(PropTriggerType.PUZZLE_FINISH, prop.getGroupId(), prop.getInstId());
//
return prop;
}
@@ -711,7 +723,12 @@ public class Player {
}
public void onTick() {
+ // Update stamina
this.updateStamina();
+ // Scene update
+ if (this.getScene() != null) {
+ this.getScene().onTick();
+ }
}
@SuppressWarnings("deprecation")
diff --git a/src/main/java/emu/lunarcore/game/scene/Scene.java b/src/main/java/emu/lunarcore/game/scene/Scene.java
index 8d36719..3f4f6cc 100644
--- a/src/main/java/emu/lunarcore/game/scene/Scene.java
+++ b/src/main/java/emu/lunarcore/game/scene/Scene.java
@@ -6,22 +6,27 @@ import java.util.List;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.config.*;
import emu.lunarcore.data.excel.MazePlaneExcel;
+import emu.lunarcore.data.excel.SummonUnitExcel;
import emu.lunarcore.game.avatar.GameAvatar;
+import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.enums.PlaneType;
import emu.lunarcore.game.scene.entity.*;
import emu.lunarcore.game.scene.triggers.PropTrigger;
import emu.lunarcore.game.scene.triggers.PropTriggerType;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.player.lineup.PlayerLineup;
+import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
import emu.lunarcore.proto.SceneEntityGroupInfoOuterClass.SceneEntityGroupInfo;
import emu.lunarcore.proto.SceneGroupStateOuterClass.SceneGroupState;
import emu.lunarcore.proto.SceneInfoOuterClass.SceneInfo;
import emu.lunarcore.server.packet.send.PacketActivateFarmElementScRsp;
+import emu.lunarcore.server.packet.send.PacketRefreshTriggerByClientScNotify;
import emu.lunarcore.server.packet.send.PacketSceneGroupRefreshScNotify;
-
+import emu.lunarcore.util.Position;
import it.unimi.dsi.fastutil.ints.*;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import lombok.Getter;
+import us.hebi.quickbuf.RepeatedInt;
@Getter
public class Scene {
@@ -39,6 +44,7 @@ public class Scene {
// Avatar entites
private final IntSet avatarEntityIds;
private final Int2ObjectMap avatars;
+ private EntitySummonUnit playerSummon;
// Other entities
private final Int2ObjectMap entities;
@@ -208,6 +214,64 @@ public class Scene {
return true;
}
+ // Summons
+
+ public synchronized void summonUnit(GameAvatar caster, SummonUnitExcel excel, Position pos, Position rot, int duration) {
+ // Remove previous summon
+ this.removeSummonUnit();
+
+ // Add a new summoned unit to scene
+ var summon = new EntitySummonUnit(this, caster, excel, pos, rot);
+ summon.setDuration(duration);
+
+ this.addEntity(summon, true);
+ }
+
+ public synchronized void removeSummonUnit() {
+ if (this.getPlayerSummon() != null) {
+ this.removeEntity(this.getPlayerSummon());
+ }
+ }
+
+ public void handleSummonUnitTriggers(int entityId, String name, MotionInfo motion, RepeatedInt targetIds) {
+ // Get summon unit
+ EntitySummonUnit summonUnit = null;
+
+ var entity = this.getEntityById(entityId);
+ if (entity instanceof EntitySummonUnit) {
+ summonUnit = (EntitySummonUnit) entity;
+ } else {
+ return;
+ }
+
+ // Get trigger
+ var trigger = summonUnit.getExcel().getInfo().getTriggerByName(name);
+ if (trigger == null) return;
+
+ // Get targets
+ var targets = new ArrayList();
+
+ for (int targetId : targetIds) {
+ var target = this.getEntityById(targetId);
+ if (target != null) {
+ targets.add(target);
+ }
+ }
+
+ // Handle task actions
+ for (var action : trigger.getActions()) {
+ action.onAttack(summonUnit.getCaster(), targets);
+ }
+
+ // Send packet
+ this.getPlayer().sendPacket(new PacketRefreshTriggerByClientScNotify(entityId, name, targetIds));
+ }
+
+ public void destroyProp(EntityProp prop) {
+ // TODO sanity check prop to make sure it can be destroyed
+ this.removeEntity(prop);
+ }
+
/**
* Returns the nearest spring (Space Anchor) to the player in the scene
* @return
@@ -238,7 +302,7 @@ public class Scene {
return spring;
}
- public void invokeTrigger(PropTriggerType type, int param1, int param2) {
+ public void invokePropTrigger(PropTriggerType type, int param1, int param2) {
for (PropTrigger trigger : this.getTriggers()) {
if (trigger.shouldRun(param1, param2)) {
trigger.run(this);
@@ -286,6 +350,26 @@ public class Scene {
}
}
+ // Player events
+
+ public void onTick() {
+ // Remove summoned unit if it expired
+ if (this.getPlayerSummon() != null) {
+ if (this.getPlayerSummon().isExpired()) {
+ this.removeSummonUnit();
+ }
+ }
+ }
+
+ public void onBattleStart(Battle battle) {
+ // Remove summoned unit
+ if (this.getPlayerSummon() != null) {
+ this.removeSummonUnit();
+ }
+ }
+
+ // Proto serialization
+
public synchronized SceneInfo toProto() {
// Set loaded flag
this.loaded = true;
diff --git a/src/main/java/emu/lunarcore/game/scene/SceneBuff.java b/src/main/java/emu/lunarcore/game/scene/SceneBuff.java
new file mode 100644
index 0000000..9cfb114
--- /dev/null
+++ b/src/main/java/emu/lunarcore/game/scene/SceneBuff.java
@@ -0,0 +1,37 @@
+package emu.lunarcore.game.scene;
+
+import emu.lunarcore.proto.BuffInfoOuterClass.BuffInfo;
+import lombok.Getter;
+
+@Getter
+public class SceneBuff {
+ private int casterAvatarId; // Owner avatar id
+ private int buffId;
+ private int buffLevel;
+ private int duration;
+ private long createTime;
+ private long expiry;
+
+ public SceneBuff(int casterAvatarId, int buffId, int seconds) {
+ this.casterAvatarId = casterAvatarId;
+ this.buffId = buffId;
+ this.buffLevel = 1;
+ this.createTime = System.currentTimeMillis();
+ this.duration = seconds * 1000;
+ this.expiry = this.createTime + duration;
+ }
+
+ // Serialization
+
+ public BuffInfo toProto() {
+ var proto = BuffInfo.newInstance()
+ .setBuffId(this.getBuffId())
+ .setLevel(this.getBuffLevel())
+ .setBaseAvatarId(this.getCasterAvatarId())
+ .setAddTimeMs(this.getCreateTime())
+ .setLifeTime(this.getDuration() / 10)
+ .setCount(1);
+
+ return proto;
+ }
+}
diff --git a/src/main/java/emu/lunarcore/game/scene/SceneEntityBuff.java b/src/main/java/emu/lunarcore/game/scene/SceneEntityBuff.java
deleted file mode 100644
index 82afe55..0000000
--- a/src/main/java/emu/lunarcore/game/scene/SceneEntityBuff.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package emu.lunarcore.game.scene;
-
-import lombok.Getter;
-
-@Getter
-public class SceneEntityBuff {
- private int owner; // Owner avatar id
- private int id;
- private long expiry;
-
- public SceneEntityBuff(int owner, int id, long duration) {
- this.owner = owner;
- this.id = id;
- this.expiry = System.currentTimeMillis() + (duration * 1000);
- }
-}
diff --git a/src/main/java/emu/lunarcore/game/scene/entity/EntityMonster.java b/src/main/java/emu/lunarcore/game/scene/entity/EntityMonster.java
index bbdde02..16e679b 100644
--- a/src/main/java/emu/lunarcore/game/scene/entity/EntityMonster.java
+++ b/src/main/java/emu/lunarcore/game/scene/entity/EntityMonster.java
@@ -5,7 +5,7 @@ import emu.lunarcore.data.config.MonsterInfo;
import emu.lunarcore.data.excel.NpcMonsterExcel;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.scene.Scene;
-import emu.lunarcore.game.scene.SceneEntityBuff;
+import emu.lunarcore.game.scene.SceneBuff;
import emu.lunarcore.game.scene.triggers.PropTriggerType;
import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
import emu.lunarcore.proto.SceneEntityInfoOuterClass.SceneEntityInfo;
@@ -29,7 +29,7 @@ public class EntityMonster implements GameEntity {
private final Position pos;
private final Position rot;
- private Int2ObjectMap buffs;
+ private Int2ObjectMap buffs;
private int farmElementId;
@Setter private int overrideStageId;
@Setter private int overrideLevel;
@@ -56,12 +56,17 @@ public class EntityMonster implements GameEntity {
}
}
- public void addBuff(int caster, int buffId, int duration) {
+ public SceneBuff addBuff(int caster, int buffId, int duration) {
if (this.buffs == null) {
this.buffs = new Int2ObjectOpenHashMap<>();
}
- this.buffs.put(buffId, new SceneEntityBuff(caster, buffId, duration));
+ // Create buff
+ var buff = new SceneBuff(caster, buffId, duration);
+
+ // Add to buff map
+ this.buffs.put(buffId, buff);
+ return buff;
}
public void applyBuffs(Battle battle) {
@@ -79,7 +84,7 @@ public class EntityMonster implements GameEntity {
}
// Get owner index
- int ownerIndex = battle.getLineup().indexOf(entry.getValue().getOwner());
+ int ownerIndex = battle.getLineup().indexOf(entry.getValue().getCasterAvatarId());
// Add buff to battle if owner exists
if (ownerIndex != -1) {
@@ -92,7 +97,7 @@ public class EntityMonster implements GameEntity {
@Override
public void onRemove() {
// Try to fire any triggers
- getScene().invokeTrigger(PropTriggerType.MONSTER_DIE, this.getGroupId(), this.getInstId());
+ getScene().invokePropTrigger(PropTriggerType.MONSTER_DIE, this.getGroupId(), this.getInstId());
}
@Override
diff --git a/src/main/java/emu/lunarcore/game/scene/entity/EntitySummonUnit.java b/src/main/java/emu/lunarcore/game/scene/entity/EntitySummonUnit.java
new file mode 100644
index 0000000..3a33be7
--- /dev/null
+++ b/src/main/java/emu/lunarcore/game/scene/entity/EntitySummonUnit.java
@@ -0,0 +1,72 @@
+package emu.lunarcore.game.scene.entity;
+
+import emu.lunarcore.data.excel.SummonUnitExcel;
+import emu.lunarcore.game.avatar.GameAvatar;
+import emu.lunarcore.game.scene.Scene;
+import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
+import emu.lunarcore.proto.SceneEntityInfoOuterClass.SceneEntityInfo;
+import emu.lunarcore.proto.SceneSummonUnitInfoOuterClass.SceneSummonUnitInfo;
+import emu.lunarcore.util.Position;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+public class EntitySummonUnit implements GameEntity {
+ @Setter private int entityId;
+ private final GameAvatar caster;
+ private final SummonUnitExcel excel;
+
+ private final Scene scene;
+ private final Position pos;
+ private final Position rot;
+ private final long createTime;
+
+ private int attachedEntityId;
+ private int duration;
+ private long expiry;
+
+ public EntitySummonUnit(Scene scene, GameAvatar caster, SummonUnitExcel excel, Position pos, Position rot) {
+ this.scene = scene;
+ this.caster = caster;
+ this.excel = excel;
+ this.pos = pos;
+ this.rot = rot;
+ this.createTime = System.currentTimeMillis();
+
+ // Attach summon unit to an entity
+ String attachPoint = excel.getInfo().getAttachPoint();
+ if (attachPoint != null && attachPoint.equals("Origin")) {
+ this.attachedEntityId = caster.getEntityId();
+ }
+ }
+
+ public void setDuration(int seconds) {
+ this.duration = seconds * 1000;
+ this.expiry = this.createTime + duration;
+ }
+
+ public boolean isExpired() {
+ return System.currentTimeMillis() > this.expiry;
+ }
+
+ @Override
+ public SceneEntityInfo toSceneEntityProto() {
+ var summon = SceneSummonUnitInfo.newInstance()
+ .setLifeTimeMs(this.getDuration())
+ .setCreateTimeMs(this.getCreateTime())
+ .setCasterEntityId(this.getCaster().getEntityId())
+ .setAttachEntityId(this.getAttachedEntityId())
+ .setSummonUnitId(this.getExcel().getId());
+
+ for (var trigger : this.getExcel().getInfo().getCustomTriggers()) {
+ summon.addCustomTriggers(trigger.getTriggerName());
+ }
+
+ var proto = SceneEntityInfo.newInstance()
+ .setEntityId(this.getEntityId())
+ .setMotion(MotionInfo.newInstance().setPos(getPos().toProto()).setRot(getRot().toProto()))
+ .setSummonUnit(summon);
+
+ return proto;
+ }
+}
diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerRefreshTriggerByClientCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerRefreshTriggerByClientCsReq.java
new file mode 100644
index 0000000..12ab472
--- /dev/null
+++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerRefreshTriggerByClientCsReq.java
@@ -0,0 +1,29 @@
+package emu.lunarcore.server.packet.recv;
+
+import emu.lunarcore.proto.RefreshTriggerByClientCsReqOuterClass.RefreshTriggerByClientCsReq;
+import emu.lunarcore.server.game.GameSession;
+import emu.lunarcore.server.packet.CmdId;
+import emu.lunarcore.server.packet.Opcodes;
+import emu.lunarcore.server.packet.PacketHandler;
+import emu.lunarcore.server.packet.send.PacketRefreshTriggerByClientScRsp;
+
+@Opcodes(CmdId.RefreshTriggerByClientCsReq)
+public class HandlerRefreshTriggerByClientCsReq extends PacketHandler {
+
+ @Override
+ public void handle(GameSession session, byte[] data) throws Exception {
+ var req = RefreshTriggerByClientCsReq.parseFrom(data);
+
+ if (session.getPlayer().getScene() != null) {
+ session.getPlayer().getScene().handleSummonUnitTriggers(
+ req.getTriggerEntityId(),
+ req.getTriggerName(),
+ req.getTriggerMotion(),
+ req.getTriggerTargetIdList()
+ );
+ }
+
+ session.send(new PacketRefreshTriggerByClientScRsp(req));
+ }
+
+}
diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketRefreshTriggerByClientScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketRefreshTriggerByClientScNotify.java
new file mode 100644
index 0000000..bc24dc7
--- /dev/null
+++ b/src/main/java/emu/lunarcore/server/packet/send/PacketRefreshTriggerByClientScNotify.java
@@ -0,0 +1,23 @@
+package emu.lunarcore.server.packet.send;
+
+import emu.lunarcore.proto.RefreshTriggerByClientScNotifyOuterClass.RefreshTriggerByClientScNotify;
+import emu.lunarcore.server.packet.BasePacket;
+import emu.lunarcore.server.packet.CmdId;
+import us.hebi.quickbuf.RepeatedInt;
+
+public class PacketRefreshTriggerByClientScNotify extends BasePacket {
+
+ public PacketRefreshTriggerByClientScNotify(int triggerEntityId, String name, RepeatedInt targetIds) {
+ super(CmdId.RefreshTriggerByClientScNotify);
+
+ var data = RefreshTriggerByClientScNotify.newInstance()
+ .setTriggerName(name)
+ .setTriggerEntityId(triggerEntityId);
+
+ for (int id : targetIds) {
+ data.addTriggerTargetIdList(id);
+ }
+
+ this.setData(data);
+ }
+}
diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketRefreshTriggerByClientScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketRefreshTriggerByClientScRsp.java
new file mode 100644
index 0000000..394dfbf
--- /dev/null
+++ b/src/main/java/emu/lunarcore/server/packet/send/PacketRefreshTriggerByClientScRsp.java
@@ -0,0 +1,20 @@
+package emu.lunarcore.server.packet.send;
+
+import emu.lunarcore.proto.RefreshTriggerByClientCsReqOuterClass.RefreshTriggerByClientCsReq;
+import emu.lunarcore.proto.RefreshTriggerByClientScRspOuterClass.RefreshTriggerByClientScRsp;
+import emu.lunarcore.server.packet.BasePacket;
+import emu.lunarcore.server.packet.CmdId;
+
+public class PacketRefreshTriggerByClientScRsp extends BasePacket {
+
+ public PacketRefreshTriggerByClientScRsp(RefreshTriggerByClientCsReq req) {
+ super(CmdId.RefreshTriggerByClientScRsp);
+
+ var data = RefreshTriggerByClientScRsp.newInstance()
+ .setTriggerEntityId(req.getTriggerEntityId())
+ .setTriggerName(req.getTriggerName())
+ .setRefreshTrigger(true);
+
+ this.setData(data);
+ }
+}
diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSyncEntityBuffChangeListScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSyncEntityBuffChangeListScNotify.java
new file mode 100644
index 0000000..ec29c7d
--- /dev/null
+++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSyncEntityBuffChangeListScNotify.java
@@ -0,0 +1,23 @@
+package emu.lunarcore.server.packet.send;
+
+import emu.lunarcore.game.scene.SceneBuff;
+import emu.lunarcore.proto.EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo;
+import emu.lunarcore.proto.SyncEntityBuffChangeListScNotifyOuterClass.SyncEntityBuffChangeListScNotify;
+import emu.lunarcore.server.packet.BasePacket;
+import emu.lunarcore.server.packet.CmdId;
+
+public class PacketSyncEntityBuffChangeListScNotify extends BasePacket {
+
+ public PacketSyncEntityBuffChangeListScNotify(int entityId, SceneBuff buff) {
+ super(CmdId.SyncEntityBuffChangeListScNotify);
+
+ var buffChange = EntityBuffChangeInfo.newInstance().setEntityId(entityId)
+ .setBuffChangeInfo(buff.toProto())
+ .setEntityId(entityId);
+
+ var data = SyncEntityBuffChangeListScNotify.newInstance()
+ .addEntityBuffInfoList(buffChange);
+
+ this.setData(data);
+ }
+}
diff --git a/src/main/java/emu/lunarcore/util/Position.java b/src/main/java/emu/lunarcore/util/Position.java
index dc31cc2..135b44f 100644
--- a/src/main/java/emu/lunarcore/util/Position.java
+++ b/src/main/java/emu/lunarcore/util/Position.java
@@ -24,6 +24,12 @@ public class Position {
this.y = position.getY();
this.z = position.getZ();
}
+
+ public Position(Vector vector) {
+ this.x = vector.getX();
+ this.y = vector.getY();
+ this.z = vector.getZ();
+ }
public int getX() {
return x;