mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-19 10:24:47 +01:00
@@ -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())));
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user