Merge pull request #1 from Akka0/development

Updated
This commit is contained in:
Akka
2022-05-06 14:16:44 +08:00
committed by GitHub
20 changed files with 353 additions and 151 deletions

View File

@@ -16,14 +16,16 @@ import emu.grasscutter.net.proto.RegionInfoOuterClass.RegionInfo;
import emu.grasscutter.net.proto.RegionSimpleInfoOuterClass.RegionSimpleInfo;
import emu.grasscutter.server.dispatch.authentication.AuthenticationHandler;
import emu.grasscutter.server.dispatch.authentication.DefaultAuthenticationHandler;
import emu.grasscutter.server.dispatch.http.GachaRecordHandler;
import emu.grasscutter.server.dispatch.json.*;
import emu.grasscutter.server.dispatch.json.ComboTokenReqJson.LoginTokenData;
import emu.grasscutter.server.event.dispatch.QueryAllRegionsEvent;
import emu.grasscutter.server.event.dispatch.QueryCurrentRegionEvent;
import emu.grasscutter.server.http.gacha.GachaRecordHandler;
import emu.grasscutter.server.http.gcstatic.StaticFileHandler;
import emu.grasscutter.tools.Tools;
import emu.grasscutter.utils.FileUtils;
import emu.grasscutter.utils.Utils;
import express.Express;
import io.javalin.http.staticfiles.Location;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
@@ -442,11 +444,18 @@ public final class DispatchServer {
// webstatic-sea.hoyoverse.com
httpServer.get("/admin/mi18n/plat_oversea/m202003048/m202003048-version.json", new DispatchHttpJsonHandler("{\"version\":51}"));
// gacha record
// gacha record.
String gachaMappingsPath = Utils.toFilePath(Grasscutter.getConfig().DATA_FOLDER + "/gacha_mappings.js");
// TODO: Only serve the html page and have a subsequent request to fetch the gacha data.
httpServer.get("/gacha", new GachaRecordHandler());
if(!(new File(gachaMappingsPath).exists())) {
Tools.createGachaMapping(gachaMappingsPath);
}
// static file provider
httpServer.get("/gcstatic/*", new StaticFileHandler());
httpServer.raw().config.addSinglePageRoot("/gacha/mappings", gachaMappingsPath, Location.EXTERNAL);
// static file support for plugins
httpServer.raw().config.precompressStaticFiles = false; // If this isn't set to false, files such as images may appear corrupted when serving static files
httpServer.listen(Grasscutter.getConfig().getDispatchOptions().Port);
Grasscutter.getLogger().info(Grasscutter.getLanguage().Dispatch_start_server_port.replace("{port}", Integer.toString(httpServer.raw().port())));

View File

@@ -1,4 +1,4 @@
package emu.grasscutter.server.http.gacha;
package emu.grasscutter.server.dispatch.http;
import java.io.File;
import java.io.IOException;
@@ -7,6 +7,7 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.Account;
import emu.grasscutter.utils.FileUtils;
import emu.grasscutter.utils.Utils;
import express.http.HttpContextHandler;
import express.http.Request;
import express.http.Response;
@@ -14,7 +15,7 @@ import express.http.Response;
public final class GachaRecordHandler implements HttpContextHandler {
String render_template;
public GachaRecordHandler() {
File template = new File(Grasscutter.getConfig().DATA_FOLDER + "gacha_records.html");
File template = new File(Utils.toFilePath(Grasscutter.getConfig().DATA_FOLDER + "/gacha_records.html"));
if (template.exists()) {
// Load from cache
render_template = new String(FileUtils.read(template));
@@ -46,7 +47,7 @@ public final class GachaRecordHandler implements HttpContextHandler {
res.send(response);
} else {
res.send("404");
res.send("No account found.");
}
}
}

View File

@@ -1,31 +0,0 @@
package emu.grasscutter.server.http.gcstatic;
import java.io.File;
import java.io.IOException;
import emu.grasscutter.Grasscutter;
import express.http.HttpContextHandler;
import express.http.Request;
import express.http.Response;
public final class StaticFileHandler implements HttpContextHandler {
String static_folder;
public StaticFileHandler() {
static_folder = Grasscutter.getConfig().RESOURCE_FOLDER + "/gcstatic";
}
@Override
public void handle(Request req, Response res) throws IOException {
// Grasscutter.getLogger().info( req.path());
String reqFilename = req.path().replace("/gcstatic", ""); // remove the leading path
reqFilename = reqFilename.replace("/../", "/./"); // security guard to prevent arbitrary read
File resFile = new File(static_folder + reqFilename);
if (resFile.exists()) {
res.sendFile(resFile.toPath());
} else {
res.status(404);
res.send("404");
}
}
}

View File

@@ -1,8 +1,9 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.props.PlayerProperty;
import emu.grasscutter.game.managers.MotionManager.MotionManager;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.game.props.LifeState;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.CombatInvocationsNotifyOuterClass.CombatInvocationsNotify;
@@ -11,13 +12,9 @@ import emu.grasscutter.net.proto.EntityMoveInfoOuterClass.EntityMoveInfo;
import emu.grasscutter.net.proto.EvtBeingHitInfoOuterClass.EvtBeingHitInfo;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.proto.MotionStateOuterClass.MotionState;
import emu.grasscutter.net.proto.VectorOuterClass.Vector;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.*;
import java.util.Arrays;
import java.util.Collection;
@Opcodes(PacketOpcodes.CombatInvocationsNotify)
public class HandlerCombatInvocationsNotify extends PacketHandler {
@@ -35,7 +32,6 @@ public class HandlerCombatInvocationsNotify extends PacketHandler {
// Handle movement
EntityMoveInfo moveInfo = EntityMoveInfo.parseFrom(entry.getCombatData());
GameEntity entity = session.getPlayer().getScene().getEntityById(moveInfo.getEntityId());
MotionState state = moveInfo.getMotionInfo().getState();
if (entity != null) {
//move
entity.getPosition().set(moveInfo.getMotionInfo().getPos());
@@ -43,56 +39,7 @@ public class HandlerCombatInvocationsNotify extends PacketHandler {
entity.setLastMoveSceneTimeMs(moveInfo.getSceneTime());
entity.setLastMoveReliableSeq(moveInfo.getReliableSeq());
entity.setMotionState(moveInfo.getMotionInfo().getState());
if(Grasscutter.getConfig().OpenStamina){
//consume stamina
int curStamina = session.getPlayer().getProperty(PlayerProperty.PROP_CUR_PERSIST_STAMINA);
int maxStamina = session.getPlayer().getProperty(PlayerProperty.PROP_MAX_STAMINA);
if (CONSUME_STAMINA_LIST.contains(state)) {
//In the water exhausted stamina
//Climbing the wall stays in place
//Sprint in the water
if (state == MotionState.MOTION_SWIM_DASH) {
curStamina -= 700;
}
//wall jump
else if (state == MotionState.MOTION_CLIMB_JUMP) {
curStamina -= 2000;
}
//climb the wall slowly
else if (state == MotionState.MOTION_CLIMB) {
curStamina -= 800;
}
else if (state == MotionState.MOTION_DASH_BEFORE_SHAKE) {
curStamina -= 2500;
}
else {
curStamina -= 500;
}
session.getPlayer().setProperty(PlayerProperty.PROP_CUR_PERSIST_STAMINA, curStamina);
session.send(new PacketPlayerPropNotify(session.getPlayer(), PlayerProperty.PROP_CUR_PERSIST_STAMINA));
break;
}
//restore stamina
if (RESTORE_STAMINA_LIST.contains(state)) {
if(state == MotionState.MOTION_STANDBY) {
Vector speed = moveInfo.getMotionInfo().getSpeed();
if(speed.getX() != 0 && speed.getZ() != 0 && speed.getY() != 0) {
break;
}
}
curStamina += 1000;
if (curStamina >= maxStamina) {
curStamina = maxStamina;
}
session.getPlayer().setProperty(PlayerProperty.PROP_CUR_PERSIST_STAMINA, curStamina);
session.send(new PacketPlayerPropNotify(session.getPlayer(), PlayerProperty.PROP_CUR_PERSIST_STAMINA));
}
}
session.getPlayer().getMotionManager().handle(session, entity, moveInfo);
}
break;
default:
@@ -111,17 +58,5 @@ public class HandlerCombatInvocationsNotify extends PacketHandler {
}
}
private static MotionState[] consumeStaminaTypes = new MotionState[]{
MotionState.MOTION_CLIMB, MotionState.MOTION_CLIMB_JUMP, MotionState.MOTION_SWIM_DASH,
MotionState.MOTION_SWIM_MOVE, MotionState.MOTION_FLY, MotionState.MOTION_DASH,
MotionState.MOTION_DASH_BEFORE_SHAKE, MotionState.MOTION_FIGHT, MotionState.MOTION_JUMP_UP_WALL_FOR_STANDBY,
MotionState.MOTION_FLY_SLOW
};
private static MotionState[] restoreStaminaTypes = new MotionState[]{
MotionState.MOTION_STANDBY, MotionState.MOTION_RUN, MotionState.MOTION_WALK,
MotionState.MOTION_STANDBY_MOVE
};
private static final Collection<MotionState> CONSUME_STAMINA_LIST = Arrays.asList(consumeStaminaTypes);
private static final Collection<MotionState> RESTORE_STAMINA_LIST = Arrays.asList(restoreStaminaTypes);
}

View File

@@ -0,0 +1,26 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify;
import emu.grasscutter.server.game.GameSession;
@Opcodes(PacketOpcodes.EvtDoSkillSuccNotify)
public class HandlerEvtDoSkillSuccNotify extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
EvtDoSkillSuccNotify notify = EvtDoSkillSuccNotify.parseFrom(payload);
// TODO: Will be used for deducting stamina for charged skills.
int caster = notify.getCasterId();
int skill = notify.getSkillId();
// Grasscutter.getLogger().warn(caster + "\t" + skill);
// session.getPlayer().getScene().broadcastPacket(new PacketEvtAvatarStandUpNotify(notify));
}
}

View File

@@ -37,6 +37,13 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler {
return;
}
// Make sure resources folder is set
if (!GameData.getAvatarDataMap().containsKey(avatarId)) {
Grasscutter.getLogger().error("No avatar data found! Please check your ExcelBinOutput folder.");
session.close();
return;
}
String nickname = req.getNickName();
if (nickname == null) {
nickname = "Traveler";
@@ -78,15 +85,11 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler {
session.send(new BasePacket(PacketOpcodes.SetPlayerBornDataRsp));
// Default mail
char d = 'G';
char e = 'r';
char z = 'a';
char u = 'c';
char s = 't';
MailBuilder mailBuilder = new MailBuilder(player.getUid(), new Mail());
mailBuilder.mail.mailContent.title = String.format("W%sl%som%s to %s%s%s%s%s%s%s%s%s%s%s!", DatabaseHelper.AWJVN, u, DatabaseHelper.AWJVN, d, e, z, GameData.EJWOA, GameData.EJWOA, u, PacketOpcodes.ONLWE, s, s, DatabaseHelper.AWJVN, e);
mailBuilder.mail.mailContent.sender = String.format("L%swnmow%s%s @ Gi%sH%sb", z, DatabaseHelper.AWJVN, e, s, PacketOpcodes.ONLWE);
mailBuilder.mail.mailContent.content = Grasscutter.getConfig().GameServer.WelcomeMailContent;
mailBuilder.mail.mailContent.title = Grasscutter.getConfig().GameServer.WelcomeMailTitle;
mailBuilder.mail.mailContent.sender = Grasscutter.getConfig().GameServer.WelcomeMailSender;
// Please credit Grasscutter if changing something here. We don't condone commercial use of the project.
mailBuilder.mail.mailContent.content = Grasscutter.getConfig().GameServer.WelcomeMailContent + "\n<type=\"browser\" text=\"GitHub\" href=\"https://github.com/Melledy/Grasscutter\"/>";
mailBuilder.mail.itemList.addAll(Arrays.asList(Grasscutter.getConfig().GameServer.WelcomeMailItems));
mailBuilder.mail.importance = 1;
player.sendMail(mailBuilder.mail);