Fix Librarian Story Quest (#2218)

* Fix Librarian Story Quest

* People die if they are killed

You want to die people instead of remove them so they play their sweet death animations.

* Nope. I take it back. Scriptlib is the wierd one to think removeEntity removes the entity.

* One must stop editing the code directly.

* Update EntityType.java

* Add warnings per Hartie

* Per Hartie, change getEntityType to EntityType
This commit is contained in:
Nazrin
2023-06-20 13:37:00 -07:00
committed by GitHub
parent 97b28b13fe
commit b58caf0632
6 changed files with 42 additions and 7 deletions

View File

@@ -52,8 +52,8 @@ public abstract class GameEntity {
public abstract void initAbilities(); public abstract void initAbilities();
public int getEntityType() { public EntityType getEntityType() {
return this.getId() >> 24; return EntityIdType.toEntityType(this.getId() >> 24);
} }
public abstract int getEntityTypeId(); public abstract int getEntityTypeId();

View File

@@ -14,6 +14,8 @@ import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
import emu.grasscutter.net.proto.GatherGadgetInfoOuterClass.GatherGadgetInfo; import emu.grasscutter.net.proto.GatherGadgetInfoOuterClass.GatherGadgetInfo;
import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType; import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType;
import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass.SceneGadgetInfo; import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass.SceneGadgetInfo;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp; import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp;
import emu.grasscutter.utils.Utils; import emu.grasscutter.utils.Utils;
@@ -57,6 +59,12 @@ public final class GadgetGatherObject extends GadgetContent {
GameItem item = new GameItem(itemData, 1); GameItem item = new GameItem(itemData, 1);
player.getInventory().addItem(item, ActionReason.Gather); player.getInventory().addItem(item, ActionReason.Gather);
getGadget()
.getScene()
.getScriptManager()
.callEvent(
new ScriptArgs(getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId()));
getGadget() getGadget()
.getScene() .getScene()
.broadcastPacket( .broadcastPacket(

View File

@@ -1,5 +1,8 @@
package emu.grasscutter.game.props; package emu.grasscutter.game.props;
import java.util.HashMap;
import java.util.Map;
public enum EntityIdType { public enum EntityIdType {
AVATAR(0x01), AVATAR(0x01),
MONSTER(0x02), MONSTER(0x02),
@@ -12,10 +15,27 @@ public enum EntityIdType {
private final int id; private final int id;
private static final Map<Integer, EntityType> map = new HashMap<>();
static {
map.put(EntityIdType.AVATAR.getId(),EntityType.Avatar);
map.put(EntityIdType.MONSTER.getId(),EntityType.Monster);
map.put(EntityIdType.NPC.getId(),EntityType.NPC);
map.put(EntityIdType.GADGET.getId(),EntityType.Gadget);
map.put(EntityIdType.REGION.getId(),EntityType.Region);
map.put(EntityIdType.WEAPON.getId(),EntityType.Equip);
map.put(EntityIdType.TEAM.getId(),EntityType.Team);
map.put(EntityIdType.MPLEVEL.getId(),EntityType.MPLevel);
}
EntityIdType(int id) { EntityIdType(int id) {
this.id = id; this.id = id;
} }
public static EntityType toEntityType(int entityId) {
return map.getOrDefault(entityId, EntityType.None);
}
public int getId() { public int getId() {
return id; return id;
} }

View File

@@ -75,6 +75,7 @@ public enum EntityType implements IntValueEnum {
Screen(64), Screen(64),
EchoShell(65), EchoShell(65),
UIInteractGadget(66), UIInteractGadget(66),
Region(98),
PlaceHolder(99); PlaceHolder(99);
private static final Int2ObjectMap<EntityType> map = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<EntityType> map = new Int2ObjectOpenHashMap<>();

View File

@@ -629,7 +629,7 @@ public class SceneScriptManager {
getScene().getEntities().values().stream() getScene().getEntities().values().stream()
.filter( .filter(
e -> e ->
e.getEntityType() == EntityType.Avatar.getValue() e.getEntityType() == EntityType.Avatar
&& region.getMetaRegion().contains(e.getPosition())) && region.getMetaRegion().contains(e.getPosition()))
.toList(); .toList();
entities.forEach(region::addEntity); entities.forEach(region::addEntity);

View File

@@ -18,6 +18,7 @@ import emu.grasscutter.game.quest.enums.QuestContent;
import emu.grasscutter.game.quest.enums.QuestState; import emu.grasscutter.game.quest.enums.QuestState;
import emu.grasscutter.game.world.SceneGroupInstance; import emu.grasscutter.game.world.SceneGroupInstance;
import emu.grasscutter.net.proto.EnterTypeOuterClass; import emu.grasscutter.net.proto.EnterTypeOuterClass;
import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType;
import emu.grasscutter.scripts.constants.EventType; import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.constants.GroupKillPolicy; import emu.grasscutter.scripts.constants.GroupKillPolicy;
import emu.grasscutter.scripts.data.SceneGroup; import emu.grasscutter.scripts.data.SceneGroup;
@@ -610,6 +611,11 @@ public class ScriptLib {
logger.debug("[LUA] Call CreateGadget with {}", logger.debug("[LUA] Call CreateGadget with {}",
printTable(table)); printTable(table));
var configId = table.get("config_id").toint(); var configId = table.get("config_id").toint();
//TODO: figure out what creating gadget configId 0 does
if (configId == 0){
Grasscutter.getLogger().warn("Tried to CreateGadget with config_id 0: {}", printTable(table));
return 0;
}
var group = getCurrentGroup(); var group = getCurrentGroup();
@@ -704,7 +710,7 @@ public class ScriptLib {
return EntityType.None.getValue(); return EntityType.None.getValue();
} }
return entity.getEntityType(); return entity.getEntityType().getValue();
} }
public int GetQuestState(int entityId, int questId){ public int GetQuestState(int entityId, int questId){
@@ -739,11 +745,11 @@ public class ScriptLib {
val entity = getSceneScriptManager().getScene().getEntityByConfigId(configId, groupId); val entity = getSceneScriptManager().getScene().getEntityByConfigId(configId, groupId);
if(entity == null || entity.getEntityType() != entityType){ if(entity == null || entity.getEntityType().getValue() != entityType){
return 1; return 1;
} }
getSceneScriptManager().getScene().removeEntity(entity); getSceneScriptManager().getScene().removeEntity(entity, VisionType.VISION_TYPE_REMOVE);
return 0; return 0;
} }
@@ -819,7 +825,7 @@ public class ScriptLib {
} }
public int IsPlayerAllAvatarDie(int sceneUid){ public int IsPlayerAllAvatarDie(int sceneUid){
logger.warn("[LUA] Call unimplemented IsPlayerAllAvatarDie {}", sceneUid); logger.warn("[LUA] Call unimplemented IsPlayerAllAvatarDie {}", sceneUid);
var playerEntities = getSceneScriptManager().getScene().getEntities().values().stream().filter(e -> e.getEntityType() == EntityIdType.AVATAR.getId()).toList(); var playerEntities = getSceneScriptManager().getScene().getEntities().values().stream().filter(e -> e.getEntityType() == EntityType.Avatar).toList();
for (GameEntity p : playerEntities){ for (GameEntity p : playerEntities){
var player = (EntityAvatar)p; var player = (EntityAvatar)p;
if(player.isAlive()){ if(player.isAlive()){