diff --git a/config.json b/config.json index 8d34319c1..b6967be68 100644 --- a/config.json +++ b/config.json @@ -1,6 +1,7 @@ { "Host": "127.0.0.1", "BinPath": "bin", + "Language": "en", "DisableSoftCrash": false, "FeaturedWeapons": 1, "HideLoginNotice": true, diff --git a/config/config.go b/config/config.go index 3dab5556e..c2c66f925 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,7 @@ import ( type Config struct { Host string `mapstructure:"Host"` BinPath string `mapstructure:"BinPath"` + Language string DisableSoftCrash bool // Disables the 'Press Return to exit' dialog allowing scripts to reboot the server automatically FeaturedWeapons int // Number of Active Feature weapons to generate daily HideLoginNotice bool // Hide the Erupe notice on login diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index b1af93beb..50039b27c 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -141,6 +141,7 @@ func handleMsgSysLogin(s *Session, p mhfpacket.MHFPacket) { s.charID = pkt.CharID0 s.token = pkt.LoginTokenString s.Unlock() + updateRights(s) bf := byteframe.NewByteFrame() bf.WriteUint32(uint32(Time_Current_Adjusted().Unix())) // Unix timestamp diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index ea745a0c5..596bb5b33 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -94,7 +94,8 @@ func handleMsgMhfGetCafeDuration(s *Session, p mhfpacket.MHFPacket) { } bf.WriteUint32(cafeTime) // Total cafe time bf.WriteUint16(0) - ps.Uint16(bf, fmt.Sprintf("Resets on %s %d", cafeReset.Month().String(), cafeReset.Day()), true) + ps.Uint16(bf, fmt.Sprintf(s.server.dict["cafeReset"], int(cafeReset.Month()), cafeReset.Day()), true) + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } diff --git a/server/channelserver/handlers_guild_scout.go b/server/channelserver/handlers_guild_scout.go index f47c28bc6..4b45cc93b 100644 --- a/server/channelserver/handlers_guild_scout.go +++ b/server/channelserver/handlers_guild_scout.go @@ -62,10 +62,9 @@ func handleMsgMhfPostGuildScout(s *Session, p mhfpacket.MHFPacket) { mail := &Mail{ SenderID: s.charID, RecipientID: pkt.CharID, - Subject: "Invitation!", + Subject: s.server.dict["guildInviteName"], Body: fmt.Sprintf( - "%s has invited you to join 「%s」\nDo you want to accept?", - getCharacterName(s, s.charID), + s.server.dict["guildInvite"], guildInfo.Name, ), IsGuildInvite: true, @@ -149,30 +148,30 @@ func handleMsgMhfAnswerGuildScout(s *Session, p mhfpacket.MHFPacket) { err = guild.AcceptApplication(s, s.charID) mail = append(mail, Mail{ RecipientID: s.charID, - Subject: "Success!", - Body: fmt.Sprintf("You successfully joined 「%s」.", guild.Name), + Subject: s.server.dict["guildInviteSuccessName"], + Body: fmt.Sprintf(s.server.dict["guildInviteSuccess"], guild.Name), IsSystemMessage: true, }) mail = append(mail, Mail{ SenderID: s.charID, RecipientID: pkt.LeaderID, - Subject: "Accepted", - Body: fmt.Sprintf("%s accepted your invitation to join 「%s」.", s.Name, guild.Name), + Subject: s.server.dict["guildInviteAcceptedName"], + Body: fmt.Sprintf(s.server.dict["guildInviteAccepted"], guild.Name), IsSystemMessage: true, }) } else { err = guild.RejectApplication(s, s.charID) mail = append(mail, Mail{ RecipientID: s.charID, - Subject: "Declined", - Body: fmt.Sprintf("You declined the invitation to join 「%s」.", guild.Name), + Subject: s.server.dict["guildInviteRejectName"], + Body: fmt.Sprintf(s.server.dict["guildInviteReject"], guild.Name), IsSystemMessage: true, }) mail = append(mail, Mail{ SenderID: s.charID, RecipientID: pkt.LeaderID, - Subject: "Declined", - Body: fmt.Sprintf("%s declined your invitation to join 「%s」.", s.Name, guild.Name), + Subject: s.server.dict["guildInviteDeclined"], + Body: fmt.Sprintf(s.server.dict["guildInviteDeclined"], guild.Name), IsSystemMessage: true, }) } diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index 82f29d03a..7c7447dfa 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -52,6 +52,9 @@ type Server struct { stagesLock sync.RWMutex stages map[string]*Stage + // Used to map different languages + dict map[string]string + // UserBinary userBinaryPartsLock sync.RWMutex userBinaryParts map[userBinaryPartID][]byte @@ -164,6 +167,8 @@ func NewServer(config *Config) *Server { // MezFes s.stages["sl1Ns462p0a0u0"] = NewStage("sl1Ns462p0a0u0") + s.dict = getLangStrings(s) + return s } @@ -279,6 +284,7 @@ func (s *Server) WorldcastMHF(pkt mhfpacket.MHFPacket, ignoredSession *Session, bf := byteframe.NewByteFrame() bf.WriteUint16(uint16(pkt.Opcode())) pkt.Build(bf, session.clientContext) + bf.WriteUint16(0x0010) session.QueueSendNonBlocking(bf.Data()) } } @@ -313,15 +319,17 @@ func (s *Server) BroadcastRaviente(ip uint32, port uint16, stage []byte, _type u var text string switch _type { case 2: - text = " is being held!" + text = s.dict["ravienteBerserk"] + case 3: + text = s.dict["ravienteExtreme"] case 4: - text = " is being held!" + text = s.dict["ravienteExtremeLimited"] case 5: - text = " is being held!" + text = s.dict["ravienteBerserkSmall"] default: s.logger.Error("Unk raviente type", zap.Uint8("_type", _type)) } - ps.Uint16(bf, text, false) + ps.Uint16(bf, text, true) bf.WriteBytes([]byte{0x5F, 0x53, 0x00}) bf.WriteUint32(ip) // IP address bf.WriteUint16(port) // Port diff --git a/server/channelserver/sys_language.go b/server/channelserver/sys_language.go new file mode 100644 index 000000000..1dc917559 --- /dev/null +++ b/server/channelserver/sys_language.go @@ -0,0 +1,52 @@ +package channelserver + +func getLangStrings(s *Server) map[string]string { + strings := make(map[string]string) + switch s.erupeConfig.Language { + case "jp": + strings["language"] = "日本語" + strings["cafeReset"] = "%d/%dにリセット" + strings["ravienteBerserk"] = "<大討伐:猛狂期>が開催されました!" + strings["ravienteExtreme"] = "<大討伐:猛狂期【極】>が開催されました!" + strings["ravienteExtremeLimited"] = "<大討伐:猛狂期【極】(制限付)>が開催されました!" + strings["ravienteBerserkSmall"] = "<大討伐:猛狂期(小数)>が開催されました!" + + strings["guildInviteName"] = "猟団勧誘のご案内" + strings["guildInvite"] = "猟団「%s」からの勧誘通知です。\n「勧誘に返答」より、返答を行ってください。" + + strings["guildInviteSuccessName"] = "成功" + strings["guildInviteSuccess"] = "あなたは「%s」に参加できました。" + + strings["guildInviteAcceptedName"] = "承諾されました" + strings["guildInviteAccepted"] = "招待した狩人が「%s」への招待を承諾しました。" + + strings["guildInviteRejectName"] = "却下しました" + strings["guildInviteReject"] = "あなたは「%s」への参加を却下しました。" + + strings["guildInviteDeclinedName"] = "辞退しました" + strings["guildInviteDeclined"] = "招待した狩人が「%s」への招待を辞退しました。" + default: + strings["language"] = "English" + strings["cafeReset"] = "Resets on %d/%d" + strings["ravienteBerserk"] = " is being held!" + strings["ravienteExtreme"] = " is being held!" + strings["ravienteExtremeLimited"] = " is being held!" + strings["ravienteBerserkSmall"] = " is being held!" + + strings["guildInviteName"] = "Invitation!" + strings["guildInvite"] = "You have been invited to join\n「%s」\nDo you want to accept?" + + strings["guildInviteSuccessName"] = "Success!" + strings["guildInviteSuccess"] = "You have successfully joined\n「%s」." + + strings["guildInviteAcceptedName"] = "Accepted" + strings["guildInviteAccepted"] = "The recipient accepted your invitation to join\n「%s」." + + strings["guildInviteRejectName"] = "Rejected" + strings["guildInviteReject"] = "You rejected the invitation to join\n「%s」." + + strings["guildInviteDeclinedName"] = "Declined" + strings["guildInviteDeclined"] = "The recipient declined your invitation to join\n「%s」." + } + return strings +}