Fix the bug that can't kill command-generated monsters

Command-generated monsters do not have spawnentry so we have to get data from getMonsterData
This commit is contained in:
ShiroSaki 2022-05-24 00:11:29 +08:00 committed by Melledy
parent 27ec8543dd
commit fef5c06a29
3 changed files with 20 additions and 9 deletions

View File

@ -216,7 +216,7 @@ public abstract class GameEntity {
// Check if dead // Check if dead
if (isDead) { if (isDead) {
getScene().killEntity(this, 0); getScene().killEntity(this, killerId);
} }
} }
} }

View File

@ -5,6 +5,7 @@ import dev.morphia.annotations.Transient;
import emu.grasscutter.data.GameData; import emu.grasscutter.data.GameData;
import emu.grasscutter.data.def.CodexAnimalData; import emu.grasscutter.data.def.CodexAnimalData;
import emu.grasscutter.data.def.CodexReliquaryData; import emu.grasscutter.data.def.CodexReliquaryData;
import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.game.entity.GameEntity; import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.inventory.GameItem; import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.inventory.ItemType; import emu.grasscutter.game.inventory.ItemType;
@ -79,22 +80,21 @@ public class PlayerCodex {
} }
public void checkAnimal(GameEntity target, CodexAnimalData.CodexAnimalUnlockCondition condition){ public void checkAnimal(GameEntity target, CodexAnimalData.CodexAnimalUnlockCondition condition){
if(target.getEntityType() == 2){ if(target instanceof EntityMonster){
var monsterId = target.getSpawnEntry().getMonsterId(); var monsterId = ((EntityMonster)target).getMonsterData().getId();
var codexAnimal = GameData.getCodexAnimalDataMap().get(monsterId); var codexAnimal = GameData.getCodexAnimalDataMap().get(monsterId);
if(!getUnlockedAnimal().containsKey(monsterId)) { if(!getUnlockedAnimal().containsKey(monsterId)) {
if (codexAnimal != null) { if (codexAnimal != null) {
if(codexAnimal.getUnlockCondition() == condition){ if(codexAnimal.getUnlockCondition() == condition || codexAnimal.getUnlockCondition() == null){
getUnlockedAnimal().put(monsterId, 1); getUnlockedAnimal().put(monsterId, 1);
player.save();
this.player.sendPacket(new PacketCodexDataUpdateNotify(3, monsterId));
} }
} }
}else{ }else{
getUnlockedAnimal().put(monsterId, getUnlockedAnimal().get(monsterId) + 1); getUnlockedAnimal().put(monsterId, getUnlockedAnimal().get(monsterId) + 1);
player.save();
} }
player.save();
this.player.sendPacket(new PacketCodexDataUpdateNotify(3, monsterId));
} }
} }

View File

@ -29,6 +29,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import org.danilopianini.util.SpatialIndex; import org.danilopianini.util.SpatialIndex;
import org.quartz.Trigger;
import java.util.*; import java.util.*;
@ -386,9 +387,19 @@ public class Scene {
} }
public void killEntity(GameEntity target, int attackerId) { public void killEntity(GameEntity target, int attackerId) {
for (Player player : this.getPlayers()) { GameEntity attacker = getEntityById(attackerId);
player.getCodex().checkAnimal(target, CodexAnimalData.CodexAnimalUnlockCondition.CODEX_COUNT_TYPE_KILL);
//Check codex
if (attacker instanceof EntityClientGadget) {
var clientGadgetOwner = getEntityById(((EntityClientGadget) attacker).getOwnerEntityId());
if(clientGadgetOwner instanceof EntityAvatar) {
((EntityClientGadget) attacker).getOwner().getCodex().checkAnimal(target, CodexAnimalData.CodexAnimalUnlockCondition.CODEX_COUNT_TYPE_KILL);
}
} }
else if (attacker instanceof EntityAvatar) {
((EntityAvatar) attacker).getPlayer().getCodex().checkAnimal(target, CodexAnimalData.CodexAnimalUnlockCondition.CODEX_COUNT_TYPE_KILL);
}
// Packet // Packet
this.broadcastPacket(new PacketLifeStateChangeNotify(attackerId, target, LifeState.LIFE_DEAD)); this.broadcastPacket(new PacketLifeStateChangeNotify(attackerId, target, LifeState.LIFE_DEAD));