mirror of
https://github.com/Melledy/Grasscutter.git
synced 2024-11-25 11:57:35 +00:00
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:
parent
97b28b13fe
commit
b58caf0632
@ -52,8 +52,8 @@ public abstract class GameEntity {
|
||||
|
||||
public abstract void initAbilities();
|
||||
|
||||
public int getEntityType() {
|
||||
return this.getId() >> 24;
|
||||
public EntityType getEntityType() {
|
||||
return EntityIdType.toEntityType(this.getId() >> 24);
|
||||
}
|
||||
|
||||
public abstract int getEntityTypeId();
|
||||
|
@ -14,6 +14,8 @@ import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
|
||||
import emu.grasscutter.net.proto.GatherGadgetInfoOuterClass.GatherGadgetInfo;
|
||||
import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType;
|
||||
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.utils.Utils;
|
||||
|
||||
@ -57,6 +59,12 @@ public final class GadgetGatherObject extends GadgetContent {
|
||||
GameItem item = new GameItem(itemData, 1);
|
||||
player.getInventory().addItem(item, ActionReason.Gather);
|
||||
|
||||
getGadget()
|
||||
.getScene()
|
||||
.getScriptManager()
|
||||
.callEvent(
|
||||
new ScriptArgs(getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId()));
|
||||
|
||||
getGadget()
|
||||
.getScene()
|
||||
.broadcastPacket(
|
||||
|
@ -1,5 +1,8 @@
|
||||
package emu.grasscutter.game.props;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public enum EntityIdType {
|
||||
AVATAR(0x01),
|
||||
MONSTER(0x02),
|
||||
@ -12,10 +15,27 @@ public enum EntityIdType {
|
||||
|
||||
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) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public static EntityType toEntityType(int entityId) {
|
||||
return map.getOrDefault(entityId, EntityType.None);
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
@ -75,6 +75,7 @@ public enum EntityType implements IntValueEnum {
|
||||
Screen(64),
|
||||
EchoShell(65),
|
||||
UIInteractGadget(66),
|
||||
Region(98),
|
||||
PlaceHolder(99);
|
||||
|
||||
private static final Int2ObjectMap<EntityType> map = new Int2ObjectOpenHashMap<>();
|
||||
|
@ -629,7 +629,7 @@ public class SceneScriptManager {
|
||||
getScene().getEntities().values().stream()
|
||||
.filter(
|
||||
e ->
|
||||
e.getEntityType() == EntityType.Avatar.getValue()
|
||||
e.getEntityType() == EntityType.Avatar
|
||||
&& region.getMetaRegion().contains(e.getPosition()))
|
||||
.toList();
|
||||
entities.forEach(region::addEntity);
|
||||
|
@ -18,6 +18,7 @@ import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.game.quest.enums.QuestState;
|
||||
import emu.grasscutter.game.world.SceneGroupInstance;
|
||||
import emu.grasscutter.net.proto.EnterTypeOuterClass;
|
||||
import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType;
|
||||
import emu.grasscutter.scripts.constants.EventType;
|
||||
import emu.grasscutter.scripts.constants.GroupKillPolicy;
|
||||
import emu.grasscutter.scripts.data.SceneGroup;
|
||||
@ -610,6 +611,11 @@ public class ScriptLib {
|
||||
logger.debug("[LUA] Call CreateGadget with {}",
|
||||
printTable(table));
|
||||
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();
|
||||
|
||||
@ -704,7 +710,7 @@ public class ScriptLib {
|
||||
return EntityType.None.getValue();
|
||||
}
|
||||
|
||||
return entity.getEntityType();
|
||||
return entity.getEntityType().getValue();
|
||||
}
|
||||
|
||||
public int GetQuestState(int entityId, int questId){
|
||||
@ -739,11 +745,11 @@ public class ScriptLib {
|
||||
|
||||
val entity = getSceneScriptManager().getScene().getEntityByConfigId(configId, groupId);
|
||||
|
||||
if(entity == null || entity.getEntityType() != entityType){
|
||||
if(entity == null || entity.getEntityType().getValue() != entityType){
|
||||
return 1;
|
||||
}
|
||||
|
||||
getSceneScriptManager().getScene().removeEntity(entity);
|
||||
getSceneScriptManager().getScene().removeEntity(entity, VisionType.VISION_TYPE_REMOVE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -819,7 +825,7 @@ public class ScriptLib {
|
||||
}
|
||||
public int IsPlayerAllAvatarDie(int 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){
|
||||
var player = (EntityAvatar)p;
|
||||
if(player.isAlive()){
|
||||
|
Loading…
Reference in New Issue
Block a user