Forráskód Böngészése

netpacks for renaming

Laserlicht 2 hónapja
szülő
commit
120213509d

+ 1 - 0
client/netlag/PackRollbackGeneratorVisitor.h

@@ -85,6 +85,7 @@ private:
 	//void visitSetCommanderProperty(SetCommanderProperty & pack) override;
 	//void visitAddQuest(AddQuest & pack) override;
 	//void visitChangeFormation(ChangeFormation & pack) override;
+	//void visitChangeTownName(ChangeTownName & pack) override;
 	//void visitChangeSpells(ChangeSpells & pack) override;
 	//void visitSetAvailableHero(SetAvailableHero & pack) override;
 	//void visitChangeObjectVisitors(ChangeObjectVisitors & pack) override;

+ 3 - 0
client/widgets/CTextInput.cpp

@@ -91,6 +91,9 @@ void CTextInputWithConfirm::textInputted(const std::string & enteredText)
 
 void CTextInputWithConfirm::confirm()
 {
+	if(getText().empty())
+		setText(initialText);
+
 	if(confirmCb && initialText != getText())
 		confirmCb();
 	removeFocus();

+ 4 - 1
client/windows/CCastleInterface.cpp

@@ -1436,7 +1436,10 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInst
 	garr->setRedrawParent(true);
 
 	heroes = std::make_shared<HeroSlots>(town, Point(241, 387), Point(241, 483), garr, true);
-	title = std::make_shared<CTextInputWithConfirm>(Rect(83, 386, 140, 20), FONT_MEDIUM, ETextAlignment::TOPLEFT, town->getNameTranslated(), true, [this](){ std::cout << title->getText(); });
+	title = std::make_shared<CTextInputWithConfirm>(Rect(83, 386, 140, 20), FONT_MEDIUM, ETextAlignment::TOPLEFT, town->getNameTranslated(), true, [this](){ 
+		std::string name = title->getText();
+		GAME->interface()->cb->setTownName(town, name);
+	});
 	income = std::make_shared<CLabel>(195, 443, FONT_SMALL, ETextAlignment::CENTER);
 	icon = std::make_shared<CAnimImage>(AnimationPath::builtin("ITPT"), 0, 0, 15, 387);
 

+ 6 - 0
lib/callback/CCallback.cpp

@@ -286,6 +286,12 @@ void CCallback::setFormation(const CGHeroInstance * hero, EArmyFormation mode)
 	sendRequest(pack);
 }
 
+void CCallback::setTownName(const CGTownInstance * town, std::string & name)
+{
+	SetTownName pack(town->id, name);
+	sendRequest(pack);
+}
+
 void CCallback::recruitHero(const CGObjectInstance *townOrTavern, const CGHeroInstance *hero, const HeroTypeID & nextHero)
 {
 	assert(townOrTavern);

+ 1 - 0
lib/callback/CCallback.h

@@ -76,6 +76,7 @@ public:
 	void trade(const ObjectInstanceID marketId, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero = nullptr) override;
 	void trade(const ObjectInstanceID marketId, EMarketMode mode, const std::vector<TradeItemSell> & id1, const std::vector<TradeItemBuy> & id2, const std::vector<ui32> & val1, const CGHeroInstance * hero = nullptr) override;
 	void setFormation(const CGHeroInstance * hero, EArmyFormation mode) override;
+	void setTownName(const CGTownInstance * town, std::string & name) override;
 	void recruitHero(const CGObjectInstance *townOrTavern, const CGHeroInstance *hero, const HeroTypeID & nextHero=HeroTypeID::NONE) override;
 	void save(const std::string &fname) override;
 	void sendMessage(const std::string &mess, const CGObjectInstance * currentObject = nullptr) override;

+ 1 - 0
lib/callback/IGameActionCallback.h

@@ -70,6 +70,7 @@ public:
 	virtual void endTurn()=0;
 	virtual void buyArtifact(const CGHeroInstance *hero, ArtifactID aid)=0; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith)
 	virtual void setFormation(const CGHeroInstance * hero, EArmyFormation mode)=0;
+	virtual void setTownName(const CGTownInstance * town, std::string & name)=0;
 
 	virtual void save(const std::string &fname) = 0;
 	virtual void sendMessage(const std::string &mess, const CGObjectInstance * currentObject = nullptr) = 0;

+ 5 - 0
lib/gameState/GameStatePackVisitor.cpp

@@ -123,6 +123,11 @@ void GameStatePackVisitor::visitChangeFormation(ChangeFormation & pack)
 	gs.getHero(pack.hid)->setFormation(pack.formation);
 }
 
+void GameStatePackVisitor::visitChangeTownName(ChangeTownName & pack)
+{
+	gs.getTown(pack.tid)->setCustomName(pack.name);
+}
+
 void GameStatePackVisitor::visitHeroVisitCastle(HeroVisitCastle & pack)
 {
 	CGHeroInstance *h = gs.getHero(pack.hid);

+ 1 - 0
lib/gameState/GameStatePackVisitor.h

@@ -87,6 +87,7 @@ public:
 	void visitSetCommanderProperty(SetCommanderProperty & pack) override;
 	void visitAddQuest(AddQuest & pack) override;
 	void visitChangeFormation(ChangeFormation & pack) override;
+	void visitChangeTownName(ChangeTownName & pack) override;
 	void visitChangeSpells(ChangeSpells & pack) override;
 	void visitSetAvailableHero(SetAvailableHero & pack) override;
 	void visitChangeObjectVisitors(ChangeObjectVisitors & pack) override;

+ 2 - 0
lib/networkPacks/NetPackVisitor.h

@@ -58,6 +58,7 @@ public:
 	virtual void visitSetCommanderProperty(SetCommanderProperty & pack) {}
 	virtual void visitAddQuest(AddQuest & pack) {}
 	virtual void visitChangeFormation(ChangeFormation & pack) {}
+	virtual void visitChangeTownName(ChangeTownName & pack) {}
 	virtual void visitRemoveObject(RemoveObject & pack) {}
 	virtual void visitTryMoveHero(TryMoveHero & pack) {}
 	virtual void visitNewStructures(NewStructures & pack) {}
@@ -144,6 +145,7 @@ public:
 	virtual void visitBuyArtifact(BuyArtifact & pack) {}
 	virtual void visitTradeOnMarketplace(TradeOnMarketplace & pack) {}
 	virtual void visitSetFormation(SetFormation & pack) {}
+	virtual void visitSetTownName(SetTownName & pack) {}
 	virtual void visitHireHero(HireHero & pack) {}
 	virtual void visitBuildBoat(BuildBoat & pack) {}
 	virtual void visitQueryReply(QueryReply & pack) {}

+ 10 - 0
lib/networkPacks/NetPacksLib.cpp

@@ -213,6 +213,11 @@ void ChangeFormation::visitTyped(ICPackVisitor & visitor)
 	visitor.visitChangeFormation(*this);
 }
 
+void ChangeTownName::visitTyped(ICPackVisitor & visitor)
+{
+	visitor.visitChangeTownName(*this);
+}
+
 void RemoveObject::visitTyped(ICPackVisitor & visitor)
 {
 	visitor.visitRemoveObject(*this);
@@ -643,6 +648,11 @@ void SetFormation::visitTyped(ICPackVisitor & visitor)
 	visitor.visitSetFormation(*this);
 }
 
+void SetTownName::visitTyped(ICPackVisitor & visitor)
+{
+	visitor.visitSetTownName(*this);
+}
+
 void HireHero::visitTyped(ICPackVisitor & visitor)
 {
 	visitor.visitHireHero(*this);

+ 14 - 0
lib/networkPacks/PacksForClient.h

@@ -614,6 +614,20 @@ struct DLL_LINKAGE ChangeFormation : public CPackForClient
 	}
 };
 
+struct DLL_LINKAGE ChangeTownName : public CPackForClient
+{
+	ObjectInstanceID tid;
+	std::string name;
+
+	void visitTyped(ICPackVisitor & visitor) override;
+
+	template <typename Handler> void serialize(Handler & h)
+	{
+		h & tid;
+		h & name;
+	}
+};
+
 struct DLL_LINKAGE RemoveObject : public CPackForClient
 {
 	RemoveObject() = default;

+ 22 - 0
lib/networkPacks/PacksForServer.h

@@ -609,6 +609,28 @@ struct DLL_LINKAGE SetFormation : public CPackForServer
 	}
 };
 
+struct DLL_LINKAGE SetTownName : public CPackForServer
+{
+	SetTownName() = default;
+	;
+	SetTownName(const ObjectInstanceID & TID, std::string Name)
+		: tid(TID)
+		, name(Name)
+	{
+	}
+	ObjectInstanceID tid;
+	std::string name;
+
+	void visitTyped(ICPackVisitor & visitor) override;
+
+	template <typename Handler> void serialize(Handler & h)
+	{
+		h & static_cast<CPackForServer &>(*this);
+		h & tid;
+		h & name;
+	}
+};
+
 struct DLL_LINKAGE HireHero : public CPackForServer
 {
 	HireHero() = default;

+ 2 - 0
lib/serializer/RegisterTypes.h

@@ -291,6 +291,8 @@ void registerTypes(Serializer &s)
 	s.template registerType<TimesStackSizeUpdater>(249);
 	s.template registerType<TimesArmySizeUpdater>(250);
 	s.template registerType<PackageReceived>(251);
+	s.template registerType<ChangeTownName>(252);
+	s.template registerType<SetTownName>(253);
 }
 
 VCMI_LIB_NAMESPACE_END

+ 17 - 0
server/CGameHandler.cpp

@@ -3219,6 +3219,23 @@ bool CGameHandler::setFormation(ObjectInstanceID hid, EArmyFormation formation)
 	return true;
 }
 
+bool CGameHandler::setTownName(ObjectInstanceID tid, std::string & name)
+{
+	const CGTownInstance *t = gameInfo().getTown(tid);
+	if (!t)
+	{
+		logGlobal->error("Town doesn't exist!");
+		return false;
+	}
+
+	ChangeTownName ctn;
+	ctn.tid = tid;
+	ctn.name = name;
+	sendAndApply(ctn);
+
+	return true;
+}
+
 bool CGameHandler::queryReply(QueryID qid, std::optional<int32_t> answer, PlayerColor player)
 {
 	logGlobal->trace("Player %s attempts answering query %d with answer:", player, qid);

+ 1 - 0
server/CGameHandler.h

@@ -212,6 +212,7 @@ public:
 	bool queryReply( QueryID qid, std::optional<int32_t> reply, PlayerColor player );
 	bool buildBoat( ObjectInstanceID objid, PlayerColor player );
 	bool setFormation( ObjectInstanceID hid, EArmyFormation formation );
+	bool setTownName( ObjectInstanceID tid, std::string & name );
 	bool tradeResources(const IMarket *market, ui32 amountToSell, PlayerColor player, GameResID toSell, GameResID toBuy);
 	bool sacrificeCreatures(const IMarket * market, const CGHeroInstance * hero, const std::vector<SlotID> & slot, const std::vector<ui32> & count);
 	bool sendResources(ui32 val, PlayerColor player, GameResID r1, PlayerColor r2);

+ 8 - 0
server/NetPacksServer.cpp

@@ -362,6 +362,14 @@ void ApplyGhNetPackVisitor::visitSetFormation(SetFormation & pack)
 	result = gh.setFormation(pack.hid, pack.formation);
 }
 
+void ApplyGhNetPackVisitor::visitSetTownName(SetTownName & pack)
+{
+	gh.throwIfWrongOwner(connection, &pack, pack.tid);
+	gh.throwIfPlayerNotActive(connection, &pack);
+
+	result = gh.setTownName(pack.tid, pack.name);
+}
+
 void ApplyGhNetPackVisitor::visitHireHero(HireHero & pack)
 {
 	gh.throwIfWrongPlayer(connection, &pack);

+ 1 - 0
server/ServerNetPackVisitors.h

@@ -58,6 +58,7 @@ public:
 	void visitBuyArtifact(BuyArtifact & pack) override;
 	void visitTradeOnMarketplace(TradeOnMarketplace & pack) override;
 	void visitSetFormation(SetFormation & pack) override;
+	void visitSetTownName(SetTownName & pack) override;
 	void visitHireHero(HireHero & pack) override;
 	void visitBuildBoat(BuildBoat & pack) override;
 	void visitQueryReply(QueryReply & pack) override;