From 86036682d73b3c2fb26f133e27d19ac2f081a66a Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 17 Jun 2023 03:00:10 +0000 Subject: [PATCH 01/14] Format code [skip actions] --- .../grasscutter/game/quest/content/ContentFinishPlot.java | 4 ++-- .../game/quest/content/ContentNotFinishPlot.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/quest/content/ContentFinishPlot.java b/src/main/java/emu/grasscutter/game/quest/content/ContentFinishPlot.java index 46a5ccf15..0a4139b1e 100644 --- a/src/main/java/emu/grasscutter/game/quest/content/ContentFinishPlot.java +++ b/src/main/java/emu/grasscutter/game/quest/content/ContentFinishPlot.java @@ -1,10 +1,10 @@ package emu.grasscutter.game.quest.content; +import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_FINISH_PLOT; + import emu.grasscutter.data.excels.quest.QuestData; import emu.grasscutter.game.quest.*; -import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_FINISH_PLOT; - @QuestValueContent(QUEST_CONTENT_FINISH_PLOT) public class ContentFinishPlot extends BaseContent { @Override diff --git a/src/main/java/emu/grasscutter/game/quest/content/ContentNotFinishPlot.java b/src/main/java/emu/grasscutter/game/quest/content/ContentNotFinishPlot.java index 157b65337..ba2fafb58 100644 --- a/src/main/java/emu/grasscutter/game/quest/content/ContentNotFinishPlot.java +++ b/src/main/java/emu/grasscutter/game/quest/content/ContentNotFinishPlot.java @@ -1,10 +1,10 @@ package emu.grasscutter.game.quest.content; +import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_NOT_FINISH_PLOT; + import emu.grasscutter.data.excels.quest.QuestData; import emu.grasscutter.game.quest.*; -import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_NOT_FINISH_PLOT; - @QuestValueContent(QUEST_CONTENT_NOT_FINISH_PLOT) public class ContentNotFinishPlot extends BaseContent { @Override @@ -13,6 +13,6 @@ public class ContentNotFinishPlot extends BaseContent { var talkData = quest.getMainQuest().getTalks().get(params[0]); var subQuest = quest.getMainQuest().getChildQuestById(params[0]); return (talkData == null && subQuest != null || condition.getParamStr().equals(paramStr)) - && condition.getParam()[0] == params[0]; + && condition.getParam()[0] == params[0]; } } From 9d94888da368e0cc27ade4ca37a5843d566a9345 Mon Sep 17 00:00:00 2001 From: Nazrin Date: Sat, 17 Jun 2023 08:00:10 -0700 Subject: [PATCH 02/14] Fix race condition with worktops (#2216) * Fix race condition with worktops * Update ScriptLib.java * Update ScriptLib.java --------- Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com> --- .../java/emu/grasscutter/scripts/ScriptLib.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java index dd975f6a3..84297bd5c 100644 --- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java +++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java @@ -152,18 +152,17 @@ public class ScriptLib { logger.debug("[LUA] Call SetWorktopOptions with {}", printTable(table)); var callParams = this.callParams.getIfExists(); var group = this.currentGroup.getIfExists(); - if(callParams == null || group == null){ + if (callParams == null || group == null) { return 1; } var configId = callParams.param1; var entity = getSceneScriptManager().getScene().getEntityByConfigId(configId); - - int[] worktopOptions = new int[table.length()]; - for(int i = 1 ;i<=table.length() ;i++){ + var worktopOptions = new int[table.length()]; + for (int i = 1; i<=table.length(); i++) { worktopOptions[i-1] = table.get(i).optint(-1); } - if(!(entity instanceof EntityGadget gadget)|| worktopOptions.length == 0){ + if (!(entity instanceof EntityGadget gadget) || worktopOptions.length == 0) { return 2; } @@ -172,9 +171,10 @@ public class ScriptLib { } worktop.addWorktopOptions(worktopOptions); - - var scene = getSceneScriptManager().getScene(); - scene.broadcastPacket(new PacketWorktopOptionNotify(gadget)); + // Done in order to synchronize with addEntities in Scene.class. + synchronized (this.getSceneScriptManager().getScene()) { + scene.broadcastPacket(new PacketWorktopOptionNotify(gadget)); + } return 0; } From 06d5bf70984cbbafed481286fc9542ece40d0a32 Mon Sep 17 00:00:00 2001 From: Magix <27646710+KingRainbow44@users.noreply.github.com> Date: Sat, 17 Jun 2023 11:24:46 -0400 Subject: [PATCH 03/14] Temporary fix to scene reference --- src/main/java/emu/grasscutter/scripts/ScriptLib.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java index 84297bd5c..871ad828c 100644 --- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java +++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java @@ -171,6 +171,7 @@ public class ScriptLib { } worktop.addWorktopOptions(worktopOptions); + var scene = this.getSceneScriptManager().getScene(); // Done in order to synchronize with addEntities in Scene.class. synchronized (this.getSceneScriptManager().getScene()) { scene.broadcastPacket(new PacketWorktopOptionNotify(gadget)); From 4ebe6fbf6355cced7237bc07f3a6d7586aa41ef1 Mon Sep 17 00:00:00 2001 From: dragon <52032586+eternalcomet@users.noreply.github.com> Date: Sun, 18 Jun 2023 03:56:47 +0800 Subject: [PATCH 04/14] dungeon drop implementation (#2215) * dungeon drop implementation * Update src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com> --------- Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com> --- .../emu/grasscutter/data/excels/dungeon/DungeonData.java | 1 + src/main/java/emu/grasscutter/game/drop/DropSystem.java | 8 ++++++++ .../emu/grasscutter/game/dungeons/DungeonManager.java | 9 +++++++-- .../game/entity/gadget/GadgetRewardStatue.java | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java b/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java index 995c49700..8e30cc54c 100644 --- a/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java +++ b/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java @@ -32,6 +32,7 @@ public class DungeonData extends GameResource { @Getter private int passRewardPreviewID; @Getter private int statueCostID; @Getter private int statueCostCount; + @Getter private int statueDrop; // not part of DungeonExcelConfigData @Getter private RewardPreviewData rewardPreviewData; diff --git a/src/main/java/emu/grasscutter/game/drop/DropSystem.java b/src/main/java/emu/grasscutter/game/drop/DropSystem.java index eea63cb5d..88baa66fb 100644 --- a/src/main/java/emu/grasscutter/game/drop/DropSystem.java +++ b/src/main/java/emu/grasscutter/game/drop/DropSystem.java @@ -80,6 +80,14 @@ public final class DropSystem extends BaseGameSystem { return dropData.getDropId(); } + public List handleDungeonRewardDrop(int dropId, boolean doubleReward) { + if (!dropTable.containsKey(dropId)) return List.of(); + var dropData = dropTable.get(dropId); + List items = new ArrayList<>(); + processDrop(dropData, doubleReward ? 2 : 1, items); + return items; + } + public boolean handleMonsterDrop(EntityMonster monster) { int dropId; int level = monster.getLevel(); diff --git a/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java b/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java index 104d2f9c5..3b4d7e620 100644 --- a/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java +++ b/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java @@ -134,7 +134,12 @@ public final class DungeonManager { } // Get and roll rewards. - List rewards = new ArrayList<>(this.rollRewards(useCondensed)); + List rewards = player.getServer().getDropSystem().handleDungeonRewardDrop(dungeonData.getStatueDrop(), useCondensed); + if (rewards.isEmpty()) { + //fallback to legacy drop system + Grasscutter.getLogger().debug("dungeon drop failed for {}", dungeonData.getId()); + rewards = new ArrayList<>(this.rollRewards(useCondensed)); + } // Add rewards to player and send notification. player.getInventory().addItems(rewards, ActionReason.DungeonStatueDrop); player.sendPacket(new PacketGadgetAutoPickDropInfoNotify(rewards)); @@ -187,7 +192,7 @@ public final class DungeonManager { amount += Utils.drawRandomListElement(candidateAmounts, entry.getProbabilities()); } - // Double rewards in multiplay mode, if specified. + // Double rewards in multiply mode, if specified. if (entry.isMpDouble() && this.getScene().getPlayerCount() > 1) { amount *= 2; } diff --git a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java index 742e79281..c3abc8f0e 100644 --- a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java +++ b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java @@ -1,5 +1,6 @@ package emu.grasscutter.game.entity.gadget; +import emu.grasscutter.Grasscutter; import emu.grasscutter.game.dungeons.challenge.DungeonChallenge; import emu.grasscutter.game.entity.EntityGadget; import emu.grasscutter.game.player.Player; From 97b28b13fef0413d3a663f6704249617d4b730ea Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 17 Jun 2023 19:58:14 +0000 Subject: [PATCH 05/14] Format code [skip actions] --- .../emu/grasscutter/game/dungeons/DungeonManager.java | 8 ++++++-- .../game/entity/gadget/GadgetRewardStatue.java | 1 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java b/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java index 3b4d7e620..b4890abc1 100644 --- a/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java +++ b/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java @@ -134,9 +134,13 @@ public final class DungeonManager { } // Get and roll rewards. - List rewards = player.getServer().getDropSystem().handleDungeonRewardDrop(dungeonData.getStatueDrop(), useCondensed); + List rewards = + player + .getServer() + .getDropSystem() + .handleDungeonRewardDrop(dungeonData.getStatueDrop(), useCondensed); if (rewards.isEmpty()) { - //fallback to legacy drop system + // fallback to legacy drop system Grasscutter.getLogger().debug("dungeon drop failed for {}", dungeonData.getId()); rewards = new ArrayList<>(this.rollRewards(useCondensed)); } diff --git a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java index c3abc8f0e..742e79281 100644 --- a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java +++ b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java @@ -1,6 +1,5 @@ package emu.grasscutter.game.entity.gadget; -import emu.grasscutter.Grasscutter; import emu.grasscutter.game.dungeons.challenge.DungeonChallenge; import emu.grasscutter.game.entity.EntityGadget; import emu.grasscutter.game.player.Player; From b58caf0632c03ae8d9065132d7e85ced3d764f48 Mon Sep 17 00:00:00 2001 From: Nazrin Date: Tue, 20 Jun 2023 13:37:00 -0700 Subject: [PATCH 06/14] 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 --- .../grasscutter/game/entity/GameEntity.java | 4 ++-- .../entity/gadget/GadgetGatherObject.java | 8 ++++++++ .../grasscutter/game/props/EntityIdType.java | 20 +++++++++++++++++++ .../grasscutter/game/props/EntityType.java | 1 + .../scripts/SceneScriptManager.java | 2 +- .../emu/grasscutter/scripts/ScriptLib.java | 14 +++++++++---- 6 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/entity/GameEntity.java b/src/main/java/emu/grasscutter/game/entity/GameEntity.java index 3ec77618d..c1c195a63 100644 --- a/src/main/java/emu/grasscutter/game/entity/GameEntity.java +++ b/src/main/java/emu/grasscutter/game/entity/GameEntity.java @@ -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(); diff --git a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java index 0244d652d..87451dad7 100644 --- a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java +++ b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java @@ -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( diff --git a/src/main/java/emu/grasscutter/game/props/EntityIdType.java b/src/main/java/emu/grasscutter/game/props/EntityIdType.java index 7d546dbb9..f9acd0f61 100644 --- a/src/main/java/emu/grasscutter/game/props/EntityIdType.java +++ b/src/main/java/emu/grasscutter/game/props/EntityIdType.java @@ -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 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; } diff --git a/src/main/java/emu/grasscutter/game/props/EntityType.java b/src/main/java/emu/grasscutter/game/props/EntityType.java index cf06ebae5..63e4240cf 100644 --- a/src/main/java/emu/grasscutter/game/props/EntityType.java +++ b/src/main/java/emu/grasscutter/game/props/EntityType.java @@ -75,6 +75,7 @@ public enum EntityType implements IntValueEnum { Screen(64), EchoShell(65), UIInteractGadget(66), + Region(98), PlaceHolder(99); private static final Int2ObjectMap map = new Int2ObjectOpenHashMap<>(); diff --git a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java index 6f46aaae0..9b21f0e66 100644 --- a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java +++ b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java @@ -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); diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java index 871ad828c..790406aa5 100644 --- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java +++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java @@ -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()){ From e706cce8024a7bb72aadc83f79794dafb5603997 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:38:14 +0000 Subject: [PATCH 07/14] Format code [skip actions] --- .../game/entity/gadget/GadgetGatherObject.java | 3 ++- .../emu/grasscutter/game/props/EntityIdType.java | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java index 87451dad7..34c6bda44 100644 --- a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java +++ b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java @@ -63,7 +63,8 @@ public final class GadgetGatherObject extends GadgetContent { .getScene() .getScriptManager() .callEvent( - new ScriptArgs(getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId())); + new ScriptArgs( + getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId())); getGadget() .getScene() diff --git a/src/main/java/emu/grasscutter/game/props/EntityIdType.java b/src/main/java/emu/grasscutter/game/props/EntityIdType.java index f9acd0f61..4c333bad9 100644 --- a/src/main/java/emu/grasscutter/game/props/EntityIdType.java +++ b/src/main/java/emu/grasscutter/game/props/EntityIdType.java @@ -18,14 +18,14 @@ public enum EntityIdType { private static final Map 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); + 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) { From 55840bcdb6c7e7f4dd4a7c845ce810f3dbfb37df Mon Sep 17 00:00:00 2001 From: CJYKK <59359590+CJYKK@users.noreply.github.com> Date: Fri, 23 Jun 2023 04:42:35 +0800 Subject: [PATCH 08/14] Synchronize the Chinese README with the English version (#2224) * Synchronize the Chinese README with the English version * Update Chinese README translation Better formatting and fixing several words that were not translated. --- docs/README_zh-CN.md | 93 ++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 63 deletions(-) diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md index 5bc37d538..71d616d15 100644 --- a/docs/README_zh-CN.md +++ b/docs/README_zh-CN.md @@ -1,11 +1,11 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
[EN](../README.md) | [简中](README_zh-CN.md) | [繁中](README_zh-TW.md) | [FR](README_fr-FR.md) | [ES](README_es-ES.md) | [HE](README_HE.md) | [RU](README_ru-RU.md) | [PL](README_pl-PL.md) | [ID](README_id-ID.md) | [KR](README_ko-KR.md) | [FIL/PH](README_fil-PH.md) | [NL](README_NL.md) | [JP](README_ja-JP.md) | [IT](README_it-IT.md) | [VI](README_vi-VN.md) -**请注意:** 欢迎成为本项目的贡献者。但在提交 PR 之前, 请仔细阅读 [代码规范](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md)。 +**注意:** 我们始终欢迎项目的贡献者。但在做贡献之前,请仔细阅读我们的[代码规范](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md)。 ## 当前功能 @@ -16,92 +16,59 @@ * 祈愿 * 多人游戏 *部分* 可用 * 从控制台生成魔物 -* 物品 (接收或升级角色、武器等) +* 背包功能(接收或升级物品、角色等)。 + +## 快速安装指南 -## 快速设置指南 +**注意:** 如需帮助,请加入我们的[Discord](https://discord.gg/T5vZU6UyeG)。 -**注意:** 如需帮助请加入 [Discord](https://discord.gg/T5vZU6UyeG) +### 快速开始(全自动) -### 环境需求 +- 获取Java 17:https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html +- 获取[MongoDB社区版](https://www.mongodb.com/try/download/community) +- 获取游戏3.7正式版 (如果你没有3.7的客户端,可以在这里找到):https://github.com/MAnggiarMustofa/GI-Download-Library/blob/main/GenshinImpact/Client/3.7.0.md) -* [Java SE - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) +- 下载[最新的Cultivation版本](https://github.com/Grasscutters/Cultivation/releases/latest)(使用以“.msi”为后缀的安装包)。 +- 以管理员身份打开Culivation,按右上角的下载按钮。 +- 点击“下载 Grasscutter 一体化” +- 点击右上角的齿轮 +- 将游戏安装路径设置为你游戏所在的位置。 +- 将自定义Java路径设置为`C:\Program Files\Java\jdk-17\bin\java.exe` +- 保持所有其它设置为默认值 - **注意:** 如果想仅**运行服务端**, 只下载 **jre** 即可 - -* [MongoDB](https://www.mongodb.com/try/download/community) (推荐 4.0+) - -* 代理程序: [mitmproxy](https://mitmproxy.org/) (仅需 mitmdump;推荐使用), [Fiddler Classic](https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe) 等 - -### 运行服务端 - -**注意:** 从旧版本升级到新版本, 需要删除 `config.json` 使其重新生成 - -1. 获取 `grasscutter.jar` - - 从 [actions](https://github.com/Grasscutters/Grasscutter/actions) 下载,或 [自行编译](#构建) -2. 在 JAR 文件根目录中创建 `resources` 文件夹并复制 `BinOutput` 和 `ExcelBinOutput` *(查看 [Wiki](https://github.com/Grasscutters/Grasscutter/wiki) 了解更多)* -3. **确认 MongoDB 服务运行正常后**,使用命令行 `java -jar grasscutter.jar` 运行 Grasscutter。 - -### 客户端连接 - -½. 在服务器控制台 [创建账户](https://github.com/Grasscutters/Grasscutter/wiki/Commands#targeting) - -1. 重定向流量: (选择其中一个) - - mitmdump: `mitmdump -s proxy.py -k` - - 信任 CA 证书: - - ​ **注意:** mitmproxy 的 CA 证书通常存放在 `%USERPROFILE%\ .mitmproxy`, 或者从 `http://mitm.it` 下载证书 - - ​ 双击 [安装根证书](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate)或者... - - - 使用命令行 - - ```shell - certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer - ``` - - - Fiddler Classic: 运行 Fiddler Classic, 在设置中开启 `解密 https 通信` 并将端口设为除 `8888` 以外的任意端口 (工具 -> 选项 -> 连接) 并加载 [此脚本](https://github.lunatic.moe/fiddlerscript) - - - [Hosts 文件](https://github.com/Grasscutters/Grasscutter/wiki/Running#traffic-route-map) - -2. 设置代理为 `127.0.0.1:8080` 或你设置的端口 - -**也可直接运行 `start.cmd` 一键启动服务端并设置代理, 但设置 `JAVA_HOME` 环境变量并配置 `start_config.cmd`** +- 点击“启动”按钮旁边的小按钮。 +- 点击“启动”按钮。 +- 随便想一个用户名登录,不需要密码。 ### 构建 -Grasscutter 使用 Gradle 来处理依赖及编译。 +Grasscutter使用Gradle来处理依赖和构建。 -**前置依赖:** +**前置:** -- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) +- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)或更高版本 - [Git](https://git-scm.com/downloads) ##### Windows ```shell -git clone https://github.com/Grasscutters/Grasscutter.git +git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git cd Grasscutter -.\gradlew.bat # 建立开发环境 +.\gradlew.bat # 设置开发环境 .\gradlew jar # 编译 ``` -##### Linux +##### Linux(GNU) ```bash -git clone https://github.com/Grasscutters/Grasscutter.git +git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git cd Grasscutter chmod +x gradlew ./gradlew jar # 编译 ``` -* 编译后的 JAR 文件会在源码根目录生成 +你可以在项目的根目录找到输出的jar。 -### 命令列表请到 [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands) 查看 +### 故障排除 -# 快速问题排除 - -* 如果编译失败, 请检查 JDK 安装是否正确 (需要 JDK 17 并确认 JDK 的 bin 文件夹处于环境变量 `PATH` 中) -* 客户端无法登录、连接、错误 4206 等其他问题... - 大部分情况是因为代理设置出现了*问题*。 - 如果使用 Fiddler,请确认 Fiddler 监听端口不是 `8888` -* 启动顺序: MongoDB > Grasscutter > 代理程序 (mitmdump, Fiddler 等) > 客户端 +获取常见问题的解决方案或寻求帮助,请加入[我们的Discord服务器](https://discord.gg/T5vZU6UyeG)并进入“support”频道。 From 9fd5f7665c6baee5db37fd66982fd7cbb214969a Mon Sep 17 00:00:00 2001 From: Nazrin Date: Fri, 23 Jun 2023 20:03:14 -0700 Subject: [PATCH 09/14] Fix unlogging quests (#2226) --- .../java/emu/grasscutter/command/commands/QuestCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/command/commands/QuestCommand.java b/src/main/java/emu/grasscutter/command/commands/QuestCommand.java index c3345520c..f4be5738c 100644 --- a/src/main/java/emu/grasscutter/command/commands/QuestCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/QuestCommand.java @@ -112,7 +112,7 @@ public final class QuestCommand implements CommandHandler { var shouldAdd = !loggedQuests.contains(questId); if (shouldAdd) loggedQuests.add(questId); - else loggedQuests.remove(questId); + else loggedQuests.remove(loggedQuests.indexOf(questId)); CommandHandler.sendMessage( sender, From 30d093f3480784c51d0cf98752d3a66feb8b58b5 Mon Sep 17 00:00:00 2001 From: Nazrin Date: Fri, 23 Jun 2023 21:37:13 -0700 Subject: [PATCH 10/14] Update ScriptLib.java (#2227) --- src/main/java/emu/grasscutter/scripts/ScriptLib.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java index 790406aa5..e6f9b3921 100644 --- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java +++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java @@ -823,17 +823,17 @@ public class ScriptLib { //TODO implement return 0; } - public int IsPlayerAllAvatarDie(int sceneUid){ + public boolean IsPlayerAllAvatarDie(int sceneUid){ logger.warn("[LUA] Call unimplemented IsPlayerAllAvatarDie {}", sceneUid); 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()){ - return 0; + return false; } } //TODO check - return 1; + return true; } public int sendShowCommonTipsToClient(String title, String content, int closeTime) { @@ -869,6 +869,11 @@ public class ScriptLib { //TODO implement var6 object has int success, int fail, bool fail_on_wipe return 0; } + public int StopChallenge(int var1, int var2){ + logger.warn("[LUA] Call unimplemented StopChallenge with {} {}", var1, var2); + //TODO implement + return 0; + } public int CreateEffigyChallengeMonster(int var1, int[] var2){ logger.warn("[LUA] Call unimplemented CreateEffigyChallengeMonster with {} {}", var1, var2); //TODO implement From 4ec274f5c57f572618e97b30fbe9b262c8f2b2ca Mon Sep 17 00:00:00 2001 From: Nazrin Date: Sun, 25 Jun 2023 07:45:37 -0700 Subject: [PATCH 11/14] Set event source for group variable changes to the variable name (#2231) --- src/main/java/emu/grasscutter/scripts/ScriptLib.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java index e6f9b3921..f967d3101 100644 --- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java +++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java @@ -403,7 +403,7 @@ public class ScriptLib { val old = variables.getOrDefault(var, value); variables.put(var, value); - getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, value, old)); + getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, value, old).setEventSource(var)); return 0; } @@ -418,7 +418,7 @@ public class ScriptLib { variables.put(var, old + value); logger.debug("[LUA] Call ChangeGroupVariableValue with {},{}", old, old+value); - getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old)); + getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old).setEventSource(var)); return LuaValue.ZERO; } From 83d447cfc222e865b81910b6e0f341bc82e653a2 Mon Sep 17 00:00:00 2001 From: Nazrin Date: Mon, 26 Jun 2023 22:49:24 -0700 Subject: [PATCH 12/14] Update region logic (#2240) --- .../java/emu/grasscutter/scripts/SceneScriptManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java index 9b21f0e66..ad67fbbc4 100644 --- a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java +++ b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java @@ -644,6 +644,7 @@ public class SceneScriptManager { .trace("Call EVENT_ENTER_REGION_{}", region.getMetaRegion().config_id); this.callEvent( new ScriptArgs(region.getGroupId(), EventType.EVENT_ENTER_REGION, region.getConfigId()) + .setEventSource(EntityType.Avatar.getValue()) .setSourceEntityId(region.getId()) .setTargetEntityId(targetId)); @@ -660,6 +661,7 @@ public class SceneScriptManager { if (region.entityHasLeft()) { this.callEvent( new ScriptArgs(region.getGroupId(), EventType.EVENT_LEAVE_REGION, region.getConfigId()) + .setEventSource(EntityType.Avatar.getValue()) .setSourceEntityId(region.getId()) .setTargetEntityId(region.getFirstEntityId())); @@ -810,10 +812,8 @@ public class SceneScriptManager { .stream() .filter( t -> - !t.getCondition().isEmpty() - && t.getCondition().substring(29).equals(String.valueOf(params.param1)) - && (t.getSource().isEmpty() - || t.getSource().equals(params.getEventSource()))) + t.getName().substring(13).equals(String.valueOf(params.param1)) + && (t.getSource().isEmpty() || t.getSource().equals(params.getEventSource()))) .collect(Collectors.toSet()); default -> this.getTriggersByEvent(eventType).stream() .filter( From 308686d9e79025f680265586f83217a08a909035 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 05:51:09 +0000 Subject: [PATCH 13/14] Format code [skip actions] --- src/main/java/emu/grasscutter/scripts/SceneScriptManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java index ad67fbbc4..bf459cb4d 100644 --- a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java +++ b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java @@ -813,7 +813,8 @@ public class SceneScriptManager { .filter( t -> t.getName().substring(13).equals(String.valueOf(params.param1)) - && (t.getSource().isEmpty() || t.getSource().equals(params.getEventSource()))) + && (t.getSource().isEmpty() + || t.getSource().equals(params.getEventSource()))) .collect(Collectors.toSet()); default -> this.getTriggersByEvent(eventType).stream() .filter( From 8c2d00fcd330277c26f6e08d51f5a2afc155a8d6 Mon Sep 17 00:00:00 2001 From: pfyy <112098515+pfyy@users.noreply.github.com> Date: Sat, 1 Jul 2023 13:17:03 +0800 Subject: [PATCH 14/14] fix README.md build badge (#2243) * fix README.md build badge * fix README_XXX.md build badge --- README.md | 2 +- docs/README_HE.md | 2 +- docs/README_NL.md | 2 +- docs/README_es-ES.md | 2 +- docs/README_fil-PH.md | 2 +- docs/README_fr-FR.md | 2 +- docs/README_id-ID.md | 2 +- docs/README_it-IT.md | 2 +- docs/README_ja-JP.md | 2 +- docs/README_ko-KR.md | 2 +- docs/README_pl-PL.md | 2 +- docs/README_ru-RU.md | 2 +- docs/README_vi-VN.md | 2 +- docs/README_zh-CN.md | 2 +- docs/README_zh-TW.md | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 5c46b58df..96da94e79 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_HE.md b/docs/README_HE.md index abf6e8ed9..e98882d10 100644 --- a/docs/README_HE.md +++ b/docs/README_HE.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_NL.md b/docs/README_NL.md index 2c9fe607a..b620a149c 100644 --- a/docs/README_NL.md +++ b/docs/README_NL.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_es-ES.md b/docs/README_es-ES.md index cf3be13d3..661ee86ff 100644 --- a/docs/README_es-ES.md +++ b/docs/README_es-ES.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_fil-PH.md b/docs/README_fil-PH.md index 569e41721..57e2198fa 100644 --- a/docs/README_fil-PH.md +++ b/docs/README_fil-PH.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_fr-FR.md b/docs/README_fr-FR.md index fe45df2ac..ff6dfec4f 100644 --- a/docs/README_fr-FR.md +++ b/docs/README_fr-FR.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_id-ID.md b/docs/README_id-ID.md index baa086ade..ccac54424 100644 --- a/docs/README_id-ID.md +++ b/docs/README_id-ID.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_it-IT.md b/docs/README_it-IT.md index 1d30929da..138c1eb7e 100644 --- a/docs/README_it-IT.md +++ b/docs/README_it-IT.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_ja-JP.md b/docs/README_ja-JP.md index 89d323eff..e117fab7f 100644 --- a/docs/README_ja-JP.md +++ b/docs/README_ja-JP.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_ko-KR.md b/docs/README_ko-KR.md index f6c8d2426..3f655b73b 100644 --- a/docs/README_ko-KR.md +++ b/docs/README_ko-KR.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_pl-PL.md b/docs/README_pl-PL.md index 8f4701357..406ee33f6 100644 --- a/docs/README_pl-PL.md +++ b/docs/README_pl-PL.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_ru-RU.md b/docs/README_ru-RU.md index a6273b20c..cf1e95e0a 100644 --- a/docs/README_ru-RU.md +++ b/docs/README_ru-RU.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_vi-VN.md b/docs/README_vi-VN.md index f89366947..7a6d22460 100644 --- a/docs/README_vi-VN.md +++ b/docs/README_vi-VN.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md index 71d616d15..7f631f8aa 100644 --- a/docs/README_zh-CN.md +++ b/docs/README_zh-CN.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documentation GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter
diff --git a/docs/README_zh-TW.md b/docs/README_zh-TW.md index c4eb5b46d..578c0010d 100644 --- a/docs/README_zh-TW.md +++ b/docs/README_zh-TW.md @@ -1,5 +1,5 @@ ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light) -
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
+
Documention GitHub release (latest by date) GitHub GitHub last commit GitHub Workflow Status
Discord - Grasscutter