Looks pretty clean and good. Keep the good work.
Beiträge von clocky
-
-
I compared the server files with the Mainline and checked all the changes. It was impressive—he updated every line of code from the Mainline, almost like Marty, but even better. It's like Marty's files, but improved. That said, Marty’s files are still good too.
-
Not only this, you have a struct issues which causes dupes. As I said before:
Most of your actions were not relevant to the Metin-cache. You often handle things poorly.
You frequently remove items from the game side first and then from the database side, which can cause synchronization issues. Instead, you should remove items from the database first, then from the game. This way, the operation can be performed only once.
The support where you ignored your customers for more than half a year? Well done. Excellent service.
I addressed this issue back then, especially after you sold yours.
Code- // Request to core to summon
- void MyShopAppear(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const std::uint32_t owner_id, const std::uint8_t channel, const long map_index
- #ifndef ENABLE_SHOP_AUTO_POS
- , const int32_t x, const int32_t y
- #endif
- );
- // Disappear shop
- void MyShopDisappear(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const std::uint32_t owner_id, bool force = false);
- // Open my Shop
- void MyShopOpen(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::string owner_name, const std::int32_t map_index, const std::uint32_t handle);
- void MyShopClose(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id);
- // Add item to my my Shop
- void MyShopAddItem(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const net::processor::TPlayerItem& item);
- // Remove item from my shop
- void MyShopRemoveItem(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const std::uint16_t pos, const std::int32_t dest_position, const std::uint8_t dest_window);
- // Change the item price of a single item
- void MyShopChangeItemPrice(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const std::uint16_t pos, const std::uint64_t price, const int32_t all);
- // Change the shop title
- void MyShopChangeSign(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const std::string& sign);
- void MyShopAdjustTime(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const time_t adjustTime, const uint32_t handle);
- // Withdraw money from my shop
- void MyShopWithdrawGold(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const std::uint64_t& gold);
- // Unlock a item slot from my shop
- void MyShopUnlockSlot(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, std::uint16_t& pos);
- void MyShopUnlockAllSlots(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle);
- // Edit my shop
- void MyShopShopEdit(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const std::uint32_t owner_id, const std::uint8_t state);
- // Open my shop history
- void MyShopOpenHistory(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const std::uint32_t owner_id);
- bool LoadShops(int pos = -1, int max = -1, int left_count = -1);
- bool LoadItems(int pos = -1, int max = -1, int left_count = -1);
- void LoadHistory();
- CShopPtr GetShop(const std::uint32_t player_id);
- #ifdef __MY_SHOP_SEARCH__
- void SearchShopItem(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const net::processor::TShopSearchDetails& details, const net::processor::TShopSearchFilter& filter);
- #endif
- void LoadCore(const std::shared_ptr<tcp::CSession>& core);
- void Update(bool force = false) const;
- void UpdateBuyRequests();
- void Flush() const;
- void AddItem(const net::item_ptr& item, const bool sorted = true);
- void RemoveItem(const net::item_ptr& item);
- bool DurationEvent(const std::shared_ptr<timer::CEvent>& event);
- bool SortEvent(const std::shared_ptr<timer::CEvent>& event);
- void AddTestShop(const std::shared_ptr<tcp::CSession>& core, const net::processor::TCreateOfflineShopTable& table);
- #ifdef __MULTI_THREAD_SERVER__
- void init_strand(boost::asio::io_service& context);
- #endif
- #ifdef __MY_SHOP_SEARCH__
- void SearchShopItem(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const net::processor::TShopSearchDetails& details, const net::processor::TShopSearchFilter& filter);
- #endif
- size_t CCategory::Filter(const std::uint32_t offset, const net::processor::TShopSearchFilter& options,
- std::vector<net::processor::TPlayerItem>* fill_vector, std::uint32_t& page)
- {
- ....
- }
- #ifdef __MULTI_THREAD_SERVER__
- void init_strand(boost::asio::io_service& context);
- #endif
Bitte melden Sie sich an, um diesen Anhang zu sehen.
Bitte melden Sie sich an, um diesen Anhang zu sehen.
If you want to see more code, feel free to write to me in DMs ("Mr. Perfect Coder," also known as "the smartest guy" in M2)
Fragwürdig, ob gerade du auf andere schießen solltest. Deine Arbeit funktioniert auch nicht auf anhieb, und support ist bei dir auch mittelmäßig, eher nur wenn du gerade mental stabil bist
Hast du jemals etwas von mir gekauft? Wenn ja, zeig mir bitte Beweise dafür. Wie sollte ich Leute unterstützen, die keinen Kontakt zu mir haben? Zeig mir Beweise, dass du etwas von mir gekauft hast, zu dem ich keinen Support geleistet habe (Systeme).
Ich sage bei jedem Kauf klar dazu, ob es Support gibt oder nicht. Wenn kein Support angeboten wird, kannst du auch nichts erwarten (z.B. reworks die ich nur an kollegen verkaufe). Außerdem hast du nie etwas von mir gekauft – falls doch, zeig mir bitte, was du gekauft hast, und zwar über öffentliche Systeme.
Inoffizielle/Custom Systeme, die nicht einmal bezahlt wurden, werden natürlich nicht supported.
Falls du Dan bist (alias Sippi, was zu 99 % wahrscheinlich ist):
Du hast mich damals ein Jahr lang auf mein Geld warten lassen. Du hast mich vollgejammert, sodass ich dir anfangs Sachen kostenlos gegeben habe. Jetzt willst du hier im Forum groß auf dicke Hose machen, nur weil ich einen Stundenlohn verlange, den du nicht zahlen willst. Und dann nennst du mich noch "Hurensohn", weil du einen Kollegen von mir gescammt hast. Sehr korrekt von dir, wirklich.
Du hast auch kein System von mir gekauft sondern mich einfach um DEV-Arbeit gebeten.
-
Zitat
There was only one dupe on my shop (v1) not related to the m2 cache, which i solved and shared the patch in a few minutes after the report. All the others was dupes related to the m2 cache.
Not only this, you have a struct issues which causes dupes. As I said before:
Most of your actions were not relevant to the Metin-cache. You often handle things poorly.
You frequently remove items from the game side first and then from the database side, which can cause synchronization issues. Instead, you should remove items from the database first, then from the game. This way, the operation can be performed only once.
ZitatI closed the sales and kept the support still active for a whole year (a whole year meanwhile i was not selling but only helping). After that year i closed also the support. All these things were done transparently and publically.
The support where you ignored your customers for more than half a year? Well done. Excellent service.
Zitat
Finally i don't see any clocky's offline shop just because it is so simple to talk, less to do things hard, right?I addressed this issue back then, especially after you sold yours.
Code- // Request to core to summon
- void MyShopAppear(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const std::uint32_t owner_id, const std::uint8_t channel, const long map_index
- #ifndef ENABLE_SHOP_AUTO_POS
- , const int32_t x, const int32_t y
- #endif
- );
- // Disappear shop
- void MyShopDisappear(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const std::uint32_t owner_id, bool force = false);
- // Open my Shop
- void MyShopOpen(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::string owner_name, const std::int32_t map_index, const std::uint32_t handle);
- void MyShopClose(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id);
- // Add item to my my Shop
- void MyShopAddItem(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const net::processor::TPlayerItem& item);
- // Remove item from my shop
- void MyShopRemoveItem(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const std::uint16_t pos, const std::int32_t dest_position, const std::uint8_t dest_window);
- // Change the item price of a single item
- void MyShopChangeItemPrice(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const std::uint16_t pos, const std::uint64_t price, const int32_t all);
- // Change the shop title
- void MyShopChangeSign(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const std::string& sign);
- void MyShopAdjustTime(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const time_t adjustTime, const uint32_t handle);
- // Withdraw money from my shop
- void MyShopWithdrawGold(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, const std::uint64_t& gold);
- // Unlock a item slot from my shop
- void MyShopUnlockSlot(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle, std::uint16_t& pos);
- void MyShopUnlockAllSlots(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t owner_id, const std::uint32_t handle);
- // Edit my shop
- void MyShopShopEdit(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const std::uint32_t owner_id, const std::uint8_t state);
- // Open my shop history
- void MyShopOpenHistory(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const std::uint32_t owner_id);
- bool LoadShops(int pos = -1, int max = -1, int left_count = -1);
- bool LoadItems(int pos = -1, int max = -1, int left_count = -1);
- void LoadHistory();
- CShopPtr GetShop(const std::uint32_t player_id);
- #ifdef __MY_SHOP_SEARCH__
- void SearchShopItem(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const net::processor::TShopSearchDetails& details, const net::processor::TShopSearchFilter& filter);
- #endif
- void LoadCore(const std::shared_ptr<tcp::CSession>& core);
- void Update(bool force = false) const;
- void UpdateBuyRequests();
- void Flush() const;
- void AddItem(const net::item_ptr& item, const bool sorted = true);
- void RemoveItem(const net::item_ptr& item);
- bool DurationEvent(const std::shared_ptr<timer::CEvent>& event);
- bool SortEvent(const std::shared_ptr<timer::CEvent>& event);
- void AddTestShop(const std::shared_ptr<tcp::CSession>& core, const net::processor::TCreateOfflineShopTable& table);
- #ifdef __MULTI_THREAD_SERVER__
- void init_strand(boost::asio::io_service& context);
- #endif
- #ifdef __MY_SHOP_SEARCH__
- void SearchShopItem(const std::shared_ptr<tcp::CSession>& core, const std::uint32_t handle, const net::processor::TShopSearchDetails& details, const net::processor::TShopSearchFilter& filter);
- #endif
- size_t CCategory::Filter(const std::uint32_t offset, const net::processor::TShopSearchFilter& options,
- std::vector<net::processor::TPlayerItem>* fill_vector, std::uint32_t& page)
- {
- ....
- }
- #ifdef __MULTI_THREAD_SERVER__
- void init_strand(boost::asio::io_service& context);
- #endif
Bitte melden Sie sich an, um diesen Anhang zu sehen.
Bitte melden Sie sich an, um diesen Anhang zu sehen.
If you want to see more code, feel free to write to me in DMs ("Mr. Perfect Coder," also known as "the smartest guy" in M2)
-
An sich eher nur hässlich als schlecht. Er bezieht sich wohl auf die public Version, währenddessen man keinen Support hat. Denn Fakt ist, das bei Ikarus seinen Offlineshops gefühlt jede Woche neue Dupe/Bugfixes nötig sind. Sowie der V1 bis zum Ende hin tatsächlich 30+ Fixes nötig hatte bis dieser mal clean war, existieren ja auch bei dem neuen V2 schon echt einige. Soviel wie ich an diesem Shop damals fixen musste, kann ich nichtmal mit 3 Händen abzählen. Und diesen ohne Support zu nutzen ist halt einfach Bullshit. Vor allem für anfänger. Aber selbst als Käufer wissen wir ja, das Ikarus sowie beim V1 irgendwann die Fliege macht, und alle Kunden ohne Support einfach stehen lässt sobald er genug verkauft hat. Und ich selbst, damals auch als Kunde, erhielt seine ganzen Fixes nichtmal. Ich musste ihm schlussendlich hinterherlaufen und jagen als ich irgendwann erfuhr das auch er noch nen Repo hat wo umdi 20-30 Dupe/Yangbugs und Crash fixes vorhanden sind. Als Käufer hätte ich diese von ihm bekommen müssen, und nicht nur einige Monate später aus dritter Ecke mitbekommen sollen. Mir selbst gab er nichtmal irgendeinen Link davon beim kauf. Weder von irgendwelchen Fixes, noch von seiner Lizenzscheiße als er einfach verschwand, und man diese zufällig in einem Forum finden musste.
Ikarus ist ein unzufälliger Idiot mit nem schlechtem Support sowie Charakter, welcher seine Kunden irgendwann einfach stehen lässt und nie wieder antworten wird. Ich glaube bis vor dem Verkauf vom V2, hat er über ein Jahr auf keine Nachricht reagiert. Und das ging jedem so. Wird wieder das selbe Spiel sein wenn er mit dem V2 genug Kohle gemacht hat. Dann heißt es 1-2 Jahre Adios, und kommt erst wieder wenn er neues Taschengeld durch einen V3 benötigt.
Wer was anderes behauptet kennt ihn noch nicht lange.
I always answered to all the clients until the support was active. If i ignored you (i don't have any "Nives" in any app so no idea who you are) i probably had my reason (which could be reselling, sharing, scamming, or simply toxic). Who think that giving a "150€/180€/200€ once" payment would receive a life-long support is just a stupid person Who dont know how hard is to help 200/300 clients every day. All the things in the world become obsolete, Your PC, your smartphone, your car. You have to upgrade them once they become obsolete, but for some reason this seems impossible to you m2 slavers.
Related for dupes, m2's cache of items and characters is a sieve. it's been giving dupes forever and after 25 years of development there are still surely uknown ones.
All the time a client reported me a bug (any bug not only the two dupes in v1) i always sent him back the fix in 1/2 hours, i never ignored anyone who was still receiving the support (i was ignoring all the resellers and scammers/ leakers ofc).
Apparently you like to whine but if people still buy daily after years then I'm probably not that bad as you say.
ZitatRelated for dupes, m2's cache of items and characters is a sieve. it's been giving dupes forever and after 25 years of development there are still surely uknown ones.
Most of your actions were not relevant to the Metin-cache. You often handle things poorly.
You frequently remove items from the game side first and then from the database side, which can cause synchronization issues. Instead, you should remove items from the database first, then from the game. This way, the operation can be performed only once.
ZitatAll the time a client reported me a bug (any bug not only the two dupes in v1) i always sent him back the fix in 1/2 hours, i never ignored anyone who was still receiving the support (i was ignoring all the resellers and scammers/ leakers ofc).
You often ignored your customers. They approached me for official shop dupe fixes because you didn’t respond. You stopped providing support, and now you’re coming back because you need money.
Before, I talked with you and explained how you could implement the offline shop without relying on buffer size. You told me I couldn’t code, but it’s simple—you can use server-side paging. By working with pages and requesting data for each page from the server, you can handle more than a million items, depending on your data types.
For me, it’s not his code that’s the issue, but his approach to coding is flawed, and his personality is very arrogant.
I do not recommend working with him or purchasing his products; both are just bad ideas.
You should take a closer look at the Aeldra Shop's implementation and consider incorporating some of their ideas.
-
I really recommended that guy, he has a good knowledge of c++/py. The files are pretty clean, I also have then.
-
I have the same issue with him, I tried to get more infos about the FreeType rendering and he just use the n2 as a base. So, he even did not know about graphics and rendering, and just copied the one from N2 about glyph and rendering. He just deleted me in the discord, after I said its from n2 and he just copied their rendering and atlas generation and configured it for m2 code.
His code:
Bitte melden Sie sich an, um dieses Bild zu sehen.
N2-Code:
Code- if (m_isOutline)
- {
- for (const auto &ch : m_chars)
- {
- const auto pCurCharInfo = ch.info;
- if (!ch.info) // skip undrawable chars
- continue;
- if (ch.emoji)
- continue;
- const Vector2 size(pCurCharInfo->_width, pCurCharInfo->_height);
- const Vector2 start(ch.x + pCurCharInfo->_bearingX,
- ch.y + fontInfo.ascender + pCurCharInfo->_bearingY);
- const Vector2 end = start + size;
- // Don't even bother sending those to the driver...
- if (clip && LiesEntirelyOutsideRect(*clip, start, end))
- continue;
- const auto tex = ch.info->_tex;
- auto &batchVertices = verticesMap[tex];
- vertices[0].texCoord.x = pCurCharInfo->_left;
- vertices[0].texCoord.y = pCurCharInfo->_top;
- vertices[1].texCoord.x = pCurCharInfo->_left;
- vertices[1].texCoord.y = pCurCharInfo->_bottom;
- vertices[2].texCoord.x = pCurCharInfo->_right;
- vertices[2].texCoord.y = pCurCharInfo->_top;
- vertices[3].texCoord.x = pCurCharInfo->_right;
- vertices[3].texCoord.y = pCurCharInfo->_bottom;
- vertices[3].diffuse = m_dwOutLineColor;
- vertices[2].diffuse = m_dwOutLineColor;
- vertices[1].diffuse = m_dwOutLineColor;
- vertices[0].diffuse = m_dwOutLineColor;
- vertices[0].position.y = pos.y + start.y - texelOfset;
- vertices[1].position.y = pos.y + end.y - texelOfset;
- vertices[2].position.y = pos.y + start.y - texelOfset;
- vertices[3].position.y = pos.y + end.y - texelOfset;
- // 왼
- vertices[0].position.x = pos.x + start.x - texelOfset;
- vertices[1].position.x = pos.x + start.x - texelOfset;
- vertices[2].position.x = pos.x + end.x - texelOfset;
- vertices[3].position.x = pos.x + end.x - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- vertices[0].position.y = pos.y + start.y - texelOfset;
- vertices[1].position.y = pos.y + end.y - texelOfset;
- vertices[2].position.y = pos.y + start.y - texelOfset;
- vertices[3].position.y = pos.y + end.y - texelOfset;
- // 왼
- vertices[0].position.x = pos.x + start.x - fFontHalfWeight - texelOfset;
- vertices[1].position.x = pos.x + start.x - fFontHalfWeight - texelOfset;
- vertices[2].position.x = pos.x + end.x - fFontHalfWeight - texelOfset;
- vertices[3].position.x = pos.x + end.x - fFontHalfWeight - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- // 오른
- vertices[0].position.x = pos.x + start.x + fFontHalfWeight - texelOfset;
- vertices[1].position.x = pos.x + start.x + fFontHalfWeight - texelOfset;
- vertices[2].position.x = pos.x + end.x + fFontHalfWeight - texelOfset;
- vertices[3].position.x = pos.x + end.x + fFontHalfWeight - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- vertices[0].position.x = pos.x + start.x - texelOfset;
- vertices[1].position.x = pos.x + start.x - texelOfset;
- vertices[2].position.x = pos.x + end.x - texelOfset;
- vertices[3].position.x = pos.x + end.x - texelOfset;
- // 위
- vertices[0].position.y = pos.y + start.y - fFontHalfWeight - texelOfset;
- vertices[1].position.y = pos.y + end.y - fFontHalfWeight - texelOfset;
- vertices[2].position.y = pos.y + start.y - fFontHalfWeight - texelOfset;
- vertices[3].position.y = pos.y + end.y - fFontHalfWeight - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- // 아래
- vertices[0].position.y = pos.y + start.y + fFontHalfWeight - texelOfset;
- vertices[1].position.y = pos.y + end.y + fFontHalfWeight - texelOfset;
- vertices[2].position.y = pos.y + start.y + fFontHalfWeight - texelOfset;
- vertices[3].position.y = pos.y + end.y + fFontHalfWeight - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- }
- }
Honestly you don't even know what I have used as base so please don't bullshit here. Thank you
Bitte melden Sie sich an, um diesen Anhang zu sehen.
N2:
CodeYours:
Bitte melden Sie sich an, um diesen Anhang zu sehen.
You deleted me after that. Why are you so offensive If I say that to you? So, yep, you used the one from n2, and the n2 render uses the same render as u 1:1. Don't be so mad. Just be honest.
-
I'd recommend against this seller. I bought from him a few times on different marketplaces and he lacks knowledge and responsibility. Especially his custom systems require hundreds of revisions and patches. Communication is also hard for him. He doesn't test anything he's going to send you for the most part. Be ware
Only one post and it is in my topic. Looks like another hater from Poland. Many of my customers are satisfied with my services. You probably bought something from me long time ago like 2 years or later. Now my background looks much better. Take care and good luck.
I have the same issue with him, I tried to get more infos about the FreeType rendering and he just use the n2 as a base. So, he even did not know about graphics and rendering, and just copied the one from N2 about glyph and rendering. He just deleted me in the discord, after I said its from n2 and he just copied their rendering and atlas generation and configured it for m2 code.
His code:
Bitte melden Sie sich an, um dieses Bild zu sehen.
N2-Code:
Code- if (m_isOutline)
- {
- for (const auto &ch : m_chars)
- {
- const auto pCurCharInfo = ch.info;
- if (!ch.info) // skip undrawable chars
- continue;
- if (ch.emoji)
- continue;
- const Vector2 size(pCurCharInfo->_width, pCurCharInfo->_height);
- const Vector2 start(ch.x + pCurCharInfo->_bearingX,
- ch.y + fontInfo.ascender + pCurCharInfo->_bearingY);
- const Vector2 end = start + size;
- // Don't even bother sending those to the driver...
- if (clip && LiesEntirelyOutsideRect(*clip, start, end))
- continue;
- const auto tex = ch.info->_tex;
- auto &batchVertices = verticesMap[tex];
- vertices[0].texCoord.x = pCurCharInfo->_left;
- vertices[0].texCoord.y = pCurCharInfo->_top;
- vertices[1].texCoord.x = pCurCharInfo->_left;
- vertices[1].texCoord.y = pCurCharInfo->_bottom;
- vertices[2].texCoord.x = pCurCharInfo->_right;
- vertices[2].texCoord.y = pCurCharInfo->_top;
- vertices[3].texCoord.x = pCurCharInfo->_right;
- vertices[3].texCoord.y = pCurCharInfo->_bottom;
- vertices[3].diffuse = m_dwOutLineColor;
- vertices[2].diffuse = m_dwOutLineColor;
- vertices[1].diffuse = m_dwOutLineColor;
- vertices[0].diffuse = m_dwOutLineColor;
- vertices[0].position.y = pos.y + start.y - texelOfset;
- vertices[1].position.y = pos.y + end.y - texelOfset;
- vertices[2].position.y = pos.y + start.y - texelOfset;
- vertices[3].position.y = pos.y + end.y - texelOfset;
- // 왼
- vertices[0].position.x = pos.x + start.x - texelOfset;
- vertices[1].position.x = pos.x + start.x - texelOfset;
- vertices[2].position.x = pos.x + end.x - texelOfset;
- vertices[3].position.x = pos.x + end.x - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- vertices[0].position.y = pos.y + start.y - texelOfset;
- vertices[1].position.y = pos.y + end.y - texelOfset;
- vertices[2].position.y = pos.y + start.y - texelOfset;
- vertices[3].position.y = pos.y + end.y - texelOfset;
- // 왼
- vertices[0].position.x = pos.x + start.x - fFontHalfWeight - texelOfset;
- vertices[1].position.x = pos.x + start.x - fFontHalfWeight - texelOfset;
- vertices[2].position.x = pos.x + end.x - fFontHalfWeight - texelOfset;
- vertices[3].position.x = pos.x + end.x - fFontHalfWeight - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- // 오른
- vertices[0].position.x = pos.x + start.x + fFontHalfWeight - texelOfset;
- vertices[1].position.x = pos.x + start.x + fFontHalfWeight - texelOfset;
- vertices[2].position.x = pos.x + end.x + fFontHalfWeight - texelOfset;
- vertices[3].position.x = pos.x + end.x + fFontHalfWeight - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- vertices[0].position.x = pos.x + start.x - texelOfset;
- vertices[1].position.x = pos.x + start.x - texelOfset;
- vertices[2].position.x = pos.x + end.x - texelOfset;
- vertices[3].position.x = pos.x + end.x - texelOfset;
- // 위
- vertices[0].position.y = pos.y + start.y - fFontHalfWeight - texelOfset;
- vertices[1].position.y = pos.y + end.y - fFontHalfWeight - texelOfset;
- vertices[2].position.y = pos.y + start.y - fFontHalfWeight - texelOfset;
- vertices[3].position.y = pos.y + end.y - fFontHalfWeight - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- // 아래
- vertices[0].position.y = pos.y + start.y + fFontHalfWeight - texelOfset;
- vertices[1].position.y = pos.y + end.y + fFontHalfWeight - texelOfset;
- vertices[2].position.y = pos.y + start.y + fFontHalfWeight - texelOfset;
- vertices[3].position.y = pos.y + end.y + fFontHalfWeight - texelOfset;
- batchVertices.push_back(vertices[0]);
- batchVertices.push_back(vertices[1]);
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[1]); //[1]
- batchVertices.push_back(vertices[2]);
- batchVertices.push_back(vertices[3]);
- }
- }
-
Ich kenne ihn schon seit längerem und kann seine Arbeit nur empfehlen.
-
I've known him for a long time, and I can highly recommend his work. He delivers great results in maps, NPCs, monsters, and effects. Highly recommended!
-
* Added more systems
4. Gif (Support Client, MT)
5. MP4, Webm (Support Client, MT)
6. Image Loading Optimization (Requires DX9)
-
-
Open again for sale:
Discord:
.neischge -
++ Added Granny Protection
-
Hello Guys,
I am currently selling several systems and offering them here. Here is a rough list:
1. Local File Loading (min. C++17)
Feature list:
- Load files from the local file system
- Enable or disable this feature in the configuration
- Specify the path of the unpacked client in
dev_settings.json
- Includes a hot-reload feature for images, covering all resources such as item icons and UI images (costs overall more with that feature)
Preview:
Bitte melden Sie sich an, um diesen Link zu sehen.
2. Emy Archiver + Emy encryption (min. C++17)
Feature list:
- Multi-threaded
- 3 Pools (main, sub, update)
- LZ4 compression
- Uses JSON for structure
- Based on modern C++20
- Utilizes my encryption (EMY)
- Easy to use
- Allows you to edit, add, and delete archives directly in the editor
Preview:
Bitte melden Sie sich an, um diesen Link zu sehen.
3. Granny Protection
Public V1: 300€ UNLIMITED SLOTS
Private V1: 800€ 0/3 SLOTS REMAINING
Custom: 1750€ 0/1 SLOTS REMAINING4. Gif (Support Client, MT)
5. MP4, Webm (Support Client, MT)
6. Image Loading Optimization (Requires DX9)
Discord: .neischge
-
Für Nitro zahl ich mit türkischer Währung knapp 30€
Crunchyroll mit anderen Währung 15€
Youtube Premium für 25$ (custom auf mein acc)
Warum hast du so überteuerte Preise? Also kaufe alles auch für'n Jahr.
-
Hello,
if a key / attribute is missing in the localeinfo in normally crashes and dont let you ingame - I added a "small" workaround for it (it's easy to implement):
Add these class into system.pyPython- class LocaleInfoWrapper(object):
- def __init__(self, wrapped):
- self.wrapped = wrapped
- def __getattr__(self, name):
- # Perform custom logic here
- try:
- return getattr(self.wrapped, name)
- except AttributeError:
- dbg.TraceError("Locale attribute not found: {0}".format(name))
- return "Locale not found: {0}".format(name)
Search for that:
Add this above:
done, now you can start the game with missing locales and it will print in out to the TraceError
NOTE: This is just something I did because one of my clients work with locales and sometimes crashes my client, you need to adjust for e.g. supporting calling etc / formating strings.. blabla
for python3 you can define the __getattr__ function inside localeinfo.py which is way easier to implement.
Bitte melden Sie sich an, um diesen Link zu sehen.
best regardsclocky
-
Great service, can only recommend it!
-
Das du Rust als backend nutzt ist so mega sexy, wow
und dann noch vue wow, probier dich mal mit das aus:
Bitte melden Sie sich an, um diesen Link zu sehen.
-
Finde es sinnvoll es so zu machen, man kann auch z.b. anstatt 0.30 30% erlauben und das mit nlohmann bauen sind vielleicht 30-40 zeilen
Code- void CBossDropSystem::LoadBossDropInfo(const std::string& path)
- {
- nlohmann::json x{};
- std::ifstream file(path);
- if (!file.is_open()) {
- sys_err("LoadBossDropInfo failed there is no file at %s ", path.c_str());
- return;
- }
- if (!m_bossDropInfo.empty())
- m_bossDropInfo.clear();
- try
- {
- nlohmann::json jsonData;
- file >> jsonData;
- std::shared_ptr<SBossDropInfoWrap> info;
- uint32_t race{};
- // Object should be a dict
- for (const auto& obj : jsonData) {
- if (obj.contains("vnum"))
- {
- race = obj["vnum"];
- }
- if (obj.contains("drops"))
- {
- info = std::make_shared<SBossDropInfoWrap>();
- if (obj.contains("count"))
- {
- info->count = obj["count"];
- }
- if (obj.contains("drops"))
- {
- for (const auto& drop : obj["drops"])
- {
- int32_t minDamage{};
- std::string type = drop["min_damage"].type_name();
- if (type == "string")
- {
- std::string d = drop["min_damage"];
- std::string searchStr = "k";
- std::string replaceStr = "000";
- std::size_t pos = 0;
- while ((pos = d.find(searchStr, pos)) != std::string::npos) {
- d.replace(pos, searchStr.length(), replaceStr);
- pos += replaceStr.length();
- }
- searchStr = "K";
- pos = 0;
- while ((pos = d.find(searchStr, pos)) != std::string::npos) {
- d.replace(pos, searchStr.length(), replaceStr);
- pos += replaceStr.length();
- }
- minDamage = std::stoi(drop["min_damage"].get<std::string>());
- }
- else
- minDamage = drop["min_damage"];
- std::string dropType = drop["prob"].type_name();
- double prob = 0.0f;
- if (dropType == "string")
- prob = parseProbability(drop["prob"].get<std::string>());
- else
- prob = drop["prob"];
- info->drops.push_back({ minDamage , drop["vnum"], drop["count"], prob });
- info->drops.back().sortPoint = getOrDefault(drop, "sortpoint", 0);
- }
- std::sort(info->drops.begin(), info->drops.end(), [](const SBossDropInfo& a, const SBossDropInfo& b)
- {
- return a.sortPoint > b.sortPoint;
- });
- }
- }
- if (info != nullptr)
- m_bossDropInfo[race] = info;
- }
- file.close();
- }
- catch (std::exception& e)
- {
- sys_err("Failed to parse config %s", e.what());
- }
CodeSo hab ich das für ein System von mir wobei das laden auch nicht so schön ist
Jo die nlohmann Implementation nutze ich auch. Schaue mir das nachher mal an was du da gemacht hast, finde die Idee mit yaml aber auch charmant
gibt noch bessere
Code- struct STalismanEntry
- {
- struct SBonus
- {
- int32_t apply{};
- int32_t value{};
- };
- bool Compare(std::vector<uint32_t>& o) const
- {
- for (const auto& vnum : vnums)
- {
- auto it = std::find(o.begin(), o.end(), vnum);
- if (it == o.end())
- {
- return false;
- }
- }
- return true;
- }
- uint32_t id{};
- std::vector<uint32_t> vnums{};
- std::vector<SBonus> bonus{};
- uint32_t affect{};
- };
- inline void from_json(const nlohmann::json& j, CTalismanSettingsLoader::STalismanEntry::SBonus& entry)
- {
- j.at("apply").get_to(entry.apply);
- j.at("value").get_to(entry.value);
- }
- inline void from_json(const nlohmann::json& j, CTalismanSettingsLoader::STalismanEntry& entry) {
- j.at("id").get_to(entry.id);
- j.at("affect").get_to(entry.affect);
- j.at("vnums").get_to(entry.vnums);
- j.at("bonus").get_to(entry.bonus);
- }
- dann kannst du z.b.
- nlohmann::json s = ...;
- CTalismanSettingsLoader::STalismanEntry t = s; // macht die Konvertierung durch die Funktion "from_json"
-
Oi,
bin gerade am basteln wegen eines Themas wofür ich Daten auf dem Server aus einer Json Datei lade und verarbeite (NPC Movement/Koordinaten/Wegpunkte).
Dabei kam mir die Idee, dass man sowas ja auch für z.B. mob_drop_item / common_drop_item / etc_drop_item benutzen könnte.
Bevor ich da jetzt zu viel Zeit rein investiere um das schick zu machen einmal ne kurze Umfrage ob da noch jemand Interesse dran hat. Falls nein dann mache ich das soweit wie es für mich funktioniert.
Habe schonmal einen Converter zum testen von mob_drop_item.txt zu mob_drop_item.json geschrieben, daher kann ich auch schon mal grob zeigen wie die Files dann aussehen würden.
Code- {
- "HungrigerWildhund": {
- "items": [
- {
- "iterator": "1",
- "vnum": "2000",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "2",
- "vnum": "50",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "3",
- "vnum": "7010",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "4",
- "vnum": "7000",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "5",
- "vnum": "3000",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "6",
- "vnum": "2020",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "7",
- "vnum": "1010",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "8",
- "vnum": "7030",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "9",
- "vnum": "5000",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "10",
- "vnum": "2010",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "11",
- "vnum": "20",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "12",
- "vnum": "7020",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "13",
- "vnum": "10",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "14",
- "vnum": "30",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "15",
- "vnum": "5010",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "16",
- "vnum": "3010",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "17",
- "vnum": "11400",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "18",
- "vnum": "11200",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "19",
- "vnum": "11240",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "20",
- "vnum": "50007",
- "quantity": "1",
- "prob": "0.09"
- },
- {
- "iterator": "21",
- "vnum": "70104",
- "quantity": "1",
- "prob": "0.30"
- }
- ],
- "Type": "drop",
- "Mob": "171"
- },
- "Wildhund": {
- "items": [
- {
- "iterator": "1",
- "vnum": "269",
- "quantity": "1",
- "prob": "100"
- }
- ],
- "Type": "drop",
- "Mob": "101"
- },
- "HungrigerWolf": {
- "items": [
- {
- "iterator": "1",
- "vnum": "2000",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "2",
- "vnum": "1000",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "3",
- "vnum": "7000",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "4",
- "vnum": "5000",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "5",
- "vnum": "2010",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "6",
- "vnum": "5010",
- "quantity": "1",
- "prob": "0.10"
- },
- {
- "iterator": "7",
- "vnum": "70104",
- "quantity": "1",
- "prob": "0.30"
- }
- ],
- "Type": "drop",
- "Mob": "172"
- }
- }
Finde es sinnvoll es so zu machen, man kann auch z.b. anstatt 0.30 30% erlauben und das mit nlohmann bauen sind vielleicht 30-40 zeilen
Code- void CBossDropSystem::LoadBossDropInfo(const std::string& path)
- {
- nlohmann::json x{};
- std::ifstream file(path);
- if (!file.is_open()) {
- sys_err("LoadBossDropInfo failed there is no file at %s ", path.c_str());
- return;
- }
- if (!m_bossDropInfo.empty())
- m_bossDropInfo.clear();
- try
- {
- nlohmann::json jsonData;
- file >> jsonData;
- std::shared_ptr<SBossDropInfoWrap> info;
- uint32_t race{};
- // Object should be a dict
- for (const auto& obj : jsonData) {
- if (obj.contains("vnum"))
- {
- race = obj["vnum"];
- }
- if (obj.contains("drops"))
- {
- info = std::make_shared<SBossDropInfoWrap>();
- if (obj.contains("count"))
- {
- info->count = obj["count"];
- }
- if (obj.contains("drops"))
- {
- for (const auto& drop : obj["drops"])
- {
- int32_t minDamage{};
- std::string type = drop["min_damage"].type_name();
- if (type == "string")
- {
- std::string d = drop["min_damage"];
- std::string searchStr = "k";
- std::string replaceStr = "000";
- std::size_t pos = 0;
- while ((pos = d.find(searchStr, pos)) != std::string::npos) {
- d.replace(pos, searchStr.length(), replaceStr);
- pos += replaceStr.length();
- }
- searchStr = "K";
- pos = 0;
- while ((pos = d.find(searchStr, pos)) != std::string::npos) {
- d.replace(pos, searchStr.length(), replaceStr);
- pos += replaceStr.length();
- }
- minDamage = std::stoi(drop["min_damage"].get<std::string>());
- }
- else
- minDamage = drop["min_damage"];
- std::string dropType = drop["prob"].type_name();
- double prob = 0.0f;
- if (dropType == "string")
- prob = parseProbability(drop["prob"].get<std::string>());
- else
- prob = drop["prob"];
- info->drops.push_back({ minDamage , drop["vnum"], drop["count"], prob });
- info->drops.back().sortPoint = getOrDefault(drop, "sortpoint", 0);
- }
- std::sort(info->drops.begin(), info->drops.end(), [](const SBossDropInfo& a, const SBossDropInfo& b)
- {
- return a.sortPoint > b.sortPoint;
- });
- }
- }
- if (info != nullptr)
- m_bossDropInfo[race] = info;
- }
- file.close();
- }
- catch (std::exception& e)
- {
- sys_err("Failed to parse config %s", e.what());
- }
CodeSo hab ich das für ein System von mir wobei das laden auch nicht so schön ist