Skip to content

Commit

Permalink
Implement summon related techniques
Browse files Browse the repository at this point in the history
Make sure to redownload config files are as new summon unit configs are required
  • Loading branch information
Melledy committed Dec 14, 2023
1 parent 6c9f674 commit 09337fd
Show file tree
Hide file tree
Showing 33 changed files with 4,746 additions and 313 deletions.
409 changes: 206 additions & 203 deletions src/generated/main/emu/lunarcore/proto/BuffInfoOuterClass.java

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

223 changes: 160 additions & 63 deletions src/generated/main/emu/lunarcore/proto/SceneEntityInfoOuterClass.java

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -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<SyncEntityBuffChangeListScNotify> implements Cloneable {
private static final long serialVersionUID = 0L;

/**
* <code>repeated .EntityBuffChangeInfo entity_buff_info_list = 5;</code>
*/
private final RepeatedMessage<EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo> entityBuffInfoList = RepeatedMessage.newEmptyInstance(EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo.getFactory());

private SyncEntityBuffChangeListScNotify() {
}

/**
* @return a new empty instance of {@code SyncEntityBuffChangeListScNotify}
*/
public static SyncEntityBuffChangeListScNotify newInstance() {
return new SyncEntityBuffChangeListScNotify();
}

/**
* <code>repeated .EntityBuffChangeInfo entity_buff_info_list = 5;</code>
* @return whether the entityBuffInfoList field is set
*/
public boolean hasEntityBuffInfoList() {
return (bitField0_ & 0x00000001) != 0;
}

/**
* <code>repeated .EntityBuffChangeInfo entity_buff_info_list = 5;</code>
* @return this
*/
public SyncEntityBuffChangeListScNotify clearEntityBuffInfoList() {
bitField0_ &= ~0x00000001;
entityBuffInfoList.clear();
return this;
}

/**
* <code>repeated .EntityBuffChangeInfo entity_buff_info_list = 5;</code>
*
* 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<EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo> getEntityBuffInfoList(
) {
return entityBuffInfoList;
}

/**
* <code>repeated .EntityBuffChangeInfo entity_buff_info_list = 5;</code>
*
* 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<EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo> getMutableEntityBuffInfoList(
) {
bitField0_ |= 0x00000001;
return entityBuffInfoList;
}

/**
* <code>repeated .EntityBuffChangeInfo entity_buff_info_list = 5;</code>
* @param value the entityBuffInfoList to add
* @return this
*/
public SyncEntityBuffChangeListScNotify addEntityBuffInfoList(
final EntityBuffChangeInfoOuterClass.EntityBuffChangeInfo value) {
bitField0_ |= 0x00000001;
entityBuffInfoList.add(value);
return this;
}

/**
* <code>repeated .EntityBuffChangeInfo entity_buff_info_list = 5;</code>
* @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<SyncEntityBuffChangeListScNotify> getFactory() {
return SyncEntityBuffChangeListScNotifyFactory.INSTANCE;
}

private enum SyncEntityBuffChangeListScNotifyFactory implements MessageFactory<SyncEntityBuffChangeListScNotify> {
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");
}
}
}
1 change: 1 addition & 0 deletions src/main/java/emu/lunarcore/data/GameData.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class GameData {
@Getter private static Int2ObjectMap<RelicExcel> relicExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<PropExcel> propExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<NpcExcel> npcExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<SummonUnitExcel> summonUnitExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<MonsterExcel> monsterExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<NpcMonsterExcel> npcMonsterExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<StageExcel> stageExcelMap = new Int2ObjectOpenHashMap<>();
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/emu/lunarcore/data/ResourceLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
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 {
Expand Down Expand Up @@ -227,8 +228,40 @@ private static void loadFloorInfos() {

// 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");
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/emu/lunarcore/data/config/SkillAbilityInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.List;

import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.AvatarExcel;
import emu.lunarcore.game.battle.skills.*;
import lombok.Getter;
Expand All @@ -27,6 +28,13 @@ public boolean parse(AvatarExcel avatarExcel) {
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);
Expand All @@ -46,6 +54,7 @@ public boolean parse(AvatarExcel avatarExcel) {
}

// "Simple" way to parse maze attacks/skills
// TODO parse tasks better
private void parseTask(MazeSkill skill, List<MazeSkillAction> actionList, TaskInfo task) {
if (task.getType().contains("AddMazeBuff")) {
// TODO get duration from params if buff duration is dynamic
Expand All @@ -59,7 +68,7 @@ private void parseTask(MazeSkill skill, List<MazeSkillAction> actionList, TaskIn
// 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);
Expand Down
Loading

0 comments on commit 09337fd

Please sign in to comment.