Teapot Implementations & Fixes (#2032)

* Add realm switching
Fix realm unlock items

* Implement exiting teapot

* Implement home level rewards

* Fix small issues

* Fix call issue

* Add 'seen unlock' packets

* Fix Sumeru Main House bricking accounts
This is only for the house, not the full realm

* Fixed realm 5

Main house needs to be placed manually for Sumeru realm (module 5) as the resources for defaults in Sumeru realm are missing. Sumeru main house cannot be exited from the door, issue due to the same missing res.

* Fix Grass main house bricking accounts

* Remove references

* Formatting change (web editor)

* Whitespace & Formatting

* Whitespace

* Make 'seen' status persistent

* Fix misnamed field

* Revert "Fix misnamed field"

This reverts commit 21ef404e14.

* Implement gaining trust (realm exp)

Add gaining trust by crafting
Add gaining trust via `/give`
Show trust in djinn menu

* Interior check for prevScene

* Correct positions & rotations

Return to front of main house when exiting from inside

* Update HandlerBackMyWorldReq.java

---------

Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
Co-authored-by: GanyusLeftHorn <1244229+GanyusLeftHorn@users.noreply.github.com>
This commit is contained in:
Thoronium
2023-02-09 09:00:16 -07:00
committed by GitHub
parent 0fc578a243
commit ab5b49b7c5
27 changed files with 5731 additions and 6 deletions

View File

@@ -69,8 +69,11 @@ public class GameHome {
if (defaultItem != null) {
Grasscutter.getLogger().info("Set player {} home {} to initial setting", ownerUid, sceneId);
return HomeSceneItem.parseFrom(defaultItem, sceneId);
} else {
// Realm res missing bricks account, use default realm data to allow main house
defaultItem = GameData.getHomeworldDefaultSaveData().get(2001);
return HomeSceneItem.parseFrom(defaultItem, sceneId);
}
return null;
});
}
@@ -85,6 +88,11 @@ public class GameHome {
player.getSession().send(new PacketHomeAllUnlockedBgmIdListNotify(player));
}
// Tell the client the reward is claimed or realm unlocked
public void onClaimReward(Player player){
player.getSession().send(new PacketPlayerHomeCompInfoNotify(player));
}
public Player getPlayer() {
if (this.player == null)
this.player = Grasscutter.getGameServer().getPlayerByUid((int) this.ownerUid, true);
@@ -123,4 +131,27 @@ public class GameHome {
.map(Int2ObjectMap.Entry::getIntKey)
.collect(Collectors.toUnmodifiableSet());
}
// Same as Player.java addExpDirectly
public void addExp(Player player, int count) {
exp += count;
int reqExp = getExpRequired(level);
while (exp >= reqExp && reqExp > 0) {
exp -= reqExp;
level += 1;
reqExp = getExpRequired(level);
// Update client level and exp
player.getSession().send(new PacketHomeBasicInfoNotify(player, false));
}
// Update client home
onOwnerLogin(player);
}
private int getExpRequired(int level) {
HomeWorldLevelData levelData = GameData.getHomeWorldLevelDataMap().get(level);
return levelData != null ? levelData.getExp() : 0;
}
}

View File

@@ -265,8 +265,10 @@ public class Inventory extends BasePlayerManager implements Iterable<GameItem> {
);
case 106 -> // Resin
this.player.getResinManager().addResin(count);
case 107 -> // Legendary Key
case 107 -> // Legendary Key
this.player.addLegendaryKey(count);
case 121 -> // Home exp
this.player.getHome().addExp(this.player, count);
case 201 -> // Primogem
this.player.setPrimogems(this.player.getPrimogems() + count);
case 202 -> // Mora

View File

@@ -4,6 +4,7 @@ import emu.grasscutter.data.GameData;
import emu.grasscutter.game.home.FurnitureMakeSlotItem;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.net.proto.ItemParamOuterClass;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.server.packet.send.*;
@@ -124,6 +125,9 @@ public class FurnitureManager extends BasePlayerManager {
player.getInventory().addItem(makeData.getFurnitureItemID(), makeData.getCount());
player.getHome().getFurnitureMakeSlotItemList().remove(slotItem.get());
// Should be for first craft, but until first craft check exists add exp for each item crafted
player.getInventory().addItem(121, makeData.getExp(), ActionReason.FurnitureMakeTake);
player.getSession().send(new PacketTakeFurnitureMakeRsp(Retcode.RET_SUCC_VALUE, makeId,
List.of(ItemParamOuterClass.ItemParam.newBuilder()
.setItemId(makeData.getFurnitureItemID())

View File

@@ -97,6 +97,7 @@ public class Player {
@Getter private int headImage;
@Getter private int nameCardId = 210001;
@Getter private Position position;
@Getter @Setter private Position prevPos;
@Getter private Position rotation;
@Getter private PlayerBirthday birthday;
@Getter private PlayerCodex codex;
@@ -116,7 +117,9 @@ public class Player {
@Getter private Set<Integer> flyCloakList;
@Getter private Set<Integer> costumeList;
@Getter @Setter private Set<Integer> rewardedLevels;
@Getter @Setter private Set<Integer> homeRewardedLevels;
@Getter @Setter private Set<Integer> realmList;
@Getter @Setter private Set<Integer> seenRealmList;
@Getter private Set<Integer> unlockedForgingBlueprints;
@Getter private Set<Integer> unlockedCombines;
@Getter private Set<Integer> unlockedFurniture;
@@ -208,6 +211,7 @@ public class Player {
this.questManager = new QuestManager(this);
this.buffManager = new PlayerBuffManager(this);
this.position = new Position(GameConstants.START_POSITION);
this.prevPos = new Position();
this.rotation = new Position(0, 307, 0);
this.sceneId = 3;
this.regionId = 1;
@@ -246,6 +250,8 @@ public class Player {
this.birthday = new PlayerBirthday();
this.rewardedLevels = new HashSet<>();
this.homeRewardedLevels = new HashSet<>();
this.seenRealmList = new HashSet<>();
this.moonCardGetTimes = new HashSet<>();
this.codex = new PlayerCodex(this);
this.progressManager = new PlayerProgressManager(this);
@@ -386,6 +392,21 @@ public class Player {
return;
}
this.realmList.add(realmId);
// Tell the client the realm is unlocked
if (realmId > 3) { // Realms 3 and below are default 'unlocked'
this.sendPacket(new PacketHomeModuleUnlockNotify(realmId));
this.getHome().onClaimReward(this);
}
}
public void addSeenRealmList(int seenId) {
if (this.seenRealmList == null) {
this.seenRealmList = new HashSet<>();
} else if (this.seenRealmList.contains(seenId)) {
return;
}
this.seenRealmList.add(seenId);
}
public int getExpeditionLimit() {

View File

@@ -14,6 +14,12 @@ public class ItemUseUnlockHomeModule extends ItemUseInt {
@Override
public boolean useItem(UseItemParams params) {
return false;
return true;
}
@Override
public boolean postUseItem(UseItemParams params){
params.player.addRealmList(this.i);
return true;
}
}