feat: implement home animals (#2329)

This commit is contained in:
hamusuke
2023-09-02 14:46:58 +09:00
committed by GitHub
parent c1045103ed
commit 97138d8c84
12 changed files with 354 additions and 34 deletions

View File

@@ -0,0 +1,61 @@
package emu.grasscutter.game.home;
import emu.grasscutter.data.excels.scene.SceneData;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.server.packet.send.PacketSceneTimeNotify;
public class HomeScene extends Scene {
public HomeScene(HomeWorld world, SceneData sceneData) {
super(world, sceneData);
this.setDontDestroyWhenEmpty(true);
}
@Override
public boolean isPaused() {
return false;
}
@Override
public HomeWorld getWorld() {
return (HomeWorld) super.getWorld();
}
public GameHome getHome() {
return this.getWorld().getHome();
}
public HomeSceneItem getSceneItem() {
return this.getHome().getHomeSceneItem(this.getId());
}
@Override
public void setPaused(boolean paused) {
}
@Override
public void onTick() {
this.getEntities().values().forEach(gameEntity -> gameEntity.onTick(this.getSceneTimeSeconds()));
this.finishLoading();
this.checkPlayerRespawn();
if (this.tickCount++ % 10 == 0) this.broadcastPacket(new PacketSceneTimeNotify(this));
}
@Override
public void checkNpcGroup() {
}
@Override
public void checkSpawns() {
}
@Override
public void addItemEntity(int itemId, int amount, GameEntity bornForm) {
}
@Override
public void loadNpcForPlayerEnter(Player player) {
}
}

View File

@@ -1,10 +1,17 @@
package emu.grasscutter.game.home;
import dev.morphia.annotations.*;
import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Id;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.binout.HomeworldDefaultSaveData;
import emu.grasscutter.game.entity.EntityHomeAnimal;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.net.proto.HomeSceneArrangementInfoOuterClass.HomeSceneArrangementInfo;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.*;
@@ -71,6 +78,19 @@ public class HomeSceneItem {
return mainHouse == null || mainHouse.getAsItem() == null;
}
public List<EntityHomeAnimal> getAnimals(Scene scene) {
return this.blockItems.values().stream()
.map(HomeBlockItem::getDeployAnimalList)
.flatMap(Collection::stream)
.filter(homeAnimalItem -> GameData.getHomeWorldAnimalDataMap().containsKey(homeAnimalItem.getFurnitureId()))
.map(homeAnimalItem -> {
return new EntityHomeAnimal(scene,
GameData.getHomeWorldAnimalDataMap().get(homeAnimalItem.getFurnitureId()),
homeAnimalItem.getSpawnPos());
})
.toList();
}
public int calComfort() {
return this.blockItems.values().stream().mapToInt(HomeBlockItem::calComfort).sum();
}

View File

@@ -1,11 +1,14 @@
package emu.grasscutter.game.home;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.entity.EntityTeam;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.*;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.game.world.World;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.proto.ChatInfoOuterClass;
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.server.packet.send.*;
import java.util.List;
import lombok.Getter;
@@ -20,6 +23,21 @@ public class HomeWorld extends World {
server.registerHomeWorld(this);
}
@Override
public void registerScene(Scene scene) {
this.addAnimalsToScene((HomeScene) scene);
super.registerScene(scene);
}
@Override
public void deregisterScene(Scene scene) {
super.deregisterScene(scene);
}
private void addAnimalsToScene(HomeScene scene) {
scene.getSceneItem().getAnimals(scene).forEach(scene::addEntity);
}
@Override
public synchronized void addPlayer(Player player) {
// Check if player already in
@@ -117,6 +135,23 @@ public class HomeWorld extends World {
.build()));
}
@Override
public HomeScene getSceneById(int sceneId) {
var scene = this.getScenes().get(sceneId);
if (scene instanceof HomeScene homeScene) {
return homeScene;
}
var sceneData = GameData.getSceneDataMap().get(sceneId);
if (sceneData != null) {
scene = new HomeScene(this, sceneData);
this.registerScene(scene);
return (HomeScene) scene;
}
return null;
}
@Override
public int getNextPeerId() {
return this.getPlayers().size() + 1;