Čas návratu jednotek

Diktator Miloš

Nový uživatel
Registrovaný uživatel
Počet poděkování
9
Ahoj,

chtěl bych se zeptat, zda je někde k dispozici přesný výpočet návratu jednotek po útoku. Myslel jsem si, že to chápu, ale včera jsem narazil na jednu abnormalitu na speedu.

Konkrétně tedy ze speedu:

Útok s beranidlem trvá 1 minutu a 36 sekund, viz screen.

1672385724104.png

Dopad útoku (oznámení):
29.12.22 23:46:03:250

Běžně jsem očekával, že návrat bude 23:46:03 + 00:01:36 = 23:47:39, ale návrat byl 23:47:40. Proč???.

Zkusil jsem tedy znova:
Dopad útoku (oznámení):
29.12.22 23:51:15:921

Použiji stejný výpočet jako v předchozím případě: 23:51:15 + 00:01:36 = 23:52:51 a opravdu se vrací 23:52:51, viz screen.

1672386057363.png


Otázka tedy zní:
Proč v prvním případě nebyl návrat 23:47:39, ale návrat trval o sekundu déle. Vyzkoušel jsem to na speedu asi 30x pouze 2x trval návrat o sekundu déle, než by se dalo očekávat. Předem upozorňuji, že milisekundy dopadu zde nehraji žádnou roli. (921 ms -> 1,36 - 250 ms -> 1,36 + 1).

Přidávám ještě dodatečné informace:
Souřadnice vesnice1 : 496|474
Souřadnice vesnice2 : 509|491
Vzdálenost: 21.400934559032695
Rychlost speedu: 400
Rychlost jednotek: 1

Výpočet času beranů = ( 21.400934559032695 * 30 [konstanta] ) / (400 [rychlost speedu] * 1 [rychlost jednotek])

Výpočet času beranů = 1.605070091927452 (minuty)
Výpočet času beranů minuty = 1

Výpočet času beranů sekundy = 0.605070091927452 * 60
Výpočet času beranů sekundy = 36.30420551564712
Výpočet času beranů sekundy = 36

Trvání: 00:01:36


Výpočet odpovídá i době trvání útoků ve hře.






Děkuji za vysvětlení
 
Naposledy upraveno:

Kluk s kamením

Uživatel
Registrovaný uživatel
Počet poděkování
133
To ti tady nevysvětlí nikdo, ve hře je dlouhodobě chyba v rámci výpočtu boje a času návratu. Před dvěmi či třemi lety jsem narazil na to, že pokud uhnu s jednotkami v čas dopadu přes pomocníka rabování, sběr surovin či nějaký script tak uhnu ve stejný čas co jsem vyčasován proběhne boj s jednotkami a zároveň jednotky jsou na cestě tzn útok stáhnu a vyčasuji útočníka.
Tento jev se projevuje stále ale v menším měřítku, na .net verzi je na to celý topic a problém není vyřešen.

Teď k tomu co píšeš ty, výpočet návratu apod fungoval roky správně, nicméně dle mého jak upravovali bod výše, tak někde udělali chybu neboť poslední měsíce sem několikrát narazil na stejný problém, jako tady popisuješ ty. Šel na mě útok, otevřel jsem si ho a po dopadu vidím čas návratu, na čas návratu jsem to poslal na 030 ms a hráč mi poslal screenshot, že dorazí o vteřinu později ačkoliv mi hra napsala čas jiný. Nemyslím si, že to je chyba stála, ale spíše nahodilá, jako píšeš ty.
Nicméně mnohdy ti tahle chyba může zkazit hru, na speed kole to tolik nevadí, ale děje se to i na světech.

Bohužel reakce admin týmu je taková, že vývojáři respektive aktivních programátoru pro sekci divoké kmeny globálně je v řádu jednotek a nemají na to takový prostor Já to nikdy nepochopil, nicméně taková je realita.
Nahlásíš chybu a za rok přijdeš a chyba je stále stejná.
 

Diktator Miloš

Nový uživatel
Registrovaný uživatel
Počet poděkování
9
Já to tedy ještě důkladněji testoval a z:
80 pokusů to vyšlo tak, že 73x byl návrat, dle očekávaní a výpočtu a 7x byl o sekundu posunut. Absolutně nehrálo roli jaké byly milisekundy, úplně náhodně bez jakékoliv šance to identifikovat.

Zarážející je fakt, že se jednalo o neustále stejné vesnici, tudíž nemůže být chyba ani v zaokrouhlování na serveru ani nějaká závislost na milisekundách dopadu.



Off Topic:
Další problém s časem, tentokrát již ne úplně snadno detekovatelný, ale potenciálně problematický je systémový javascriptový objekt hry Timing. Ten při volání "Timing.getCurrentServerTime()" by měl vrátit aktuální serverový čas, to však neplatí, jelikož pokud na základě tohoto času provedu potvrzení útoku, útok dopadne ještě dříve než byl aktuální serverový čas na základě "Timing.getCurrentServerTime()".

Příklad časová osa:
1) "Timing.getCurrentServerTime()" říká aktuální serverový čas je 30.12.2022 14:21:57:118
2) Zároveň jsem v tomto čase (pár ms po) potvrdil odeslání útoku.
3) Útok se tváří, že by odeslán v 30.12.2022 14:21:56:907

Kde může být problém?
getCurrentServerTime: function() { return this.initial_server_time + this.getReturnTimeFromServer() + this.getElapsedTimeSinceLoad() } getElapsedTimeSinceLoad: function() { return this.supportsPerformanceAPI() ? performance.now() - this.getReturnTimeFromServer() : (new Date).getTime() - Timing.initial_local_time } getReturnTimeFromServer: function() { return this.offset_from_server } init: function(e) { for (var i in this.initial_server_time = Math.round(1e3 * e), this.supportsPerformanceAPI() ? (this.offset_from_server = Date.now() - performance.timing.responseStart, this.offset_to_server = performance.timing.responseStart - performance.timing.fetchStart) : this.initial_local_time = (new Date).getTime(), Timing.tickHandlers) Timing.tickHandlers.hasOwnProperty(i) && Timing.tickHandlers[i].hasOwnProperty("init") && Timing.tickHandlers[i].init(); var t = $("#serverTime").click(function() { Timing.pause() }); Timing.offset_to_server && t.attr("title", _("21e51f5ec0c5aaa92bd7bec02c0e775a") + " " + Timing.offset_to_server + "ms"), this.is_ready = !0, this.when_ready.forEach(function(e) { e() }), this.doGlobalTick() }, Timing.init(1672406146.9923);

Funkce getCurrentServerTime se vypočítává ze 3 různých časů. (1 - čas vygenerování stránky na serveru, 2 - doba načítání stránky, 3 - čas od načtení stránky). Dochází zde k menším nepřesnostem, ale opět při časování může být problematické. Také se zde používá performance.timing.responseStart, který už je deprecated.
 
Naposledy upraveno:

Kluk s kamením

Uživatel
Registrovaný uživatel
Počet poděkování
133
Off Topic:
Další problém s časem, tentokrát již ne úplně snadno detekovatelný, ale potenciálně problematický je systémový javascriptový objekt hry Timing. Ten při volání "Timing.getCurrentServerTime()" by měl vrátit aktuální serverový čas, to však neplatí, jelikož pokud na základě tohoto času provedu potvrzení útoku, útok dopadne ještě dříve než byl aktuální serverový čas na základě "Timing.getCurrentServerTime()".
]

To je pravda, ale domnívám se, že to tak fungovalo odjakživa a na základě toho bylo možné časovat jednotku na jednotku či mnohdy uhnout s jednotkami na vteřinu, jelikož jednotky reálné opustili vesnici dříve.

Jenže za poslední roky se něco změnilo. Před rokem jsem si napsal skript na backtime který vždy poslal stejnou jednotku na návrat útočícího a stávalo se, že útok dopadl dříve než byl serverový čas o několik desítek dříve než byl reálný dopad útočníka. Script jsem opravoval několikrát a nikdy nedocílil toho, aby fungoval na 100% díky těmto zvláštním jevům.

Stejně tak je problém u výpočtu boje.
Odešlu útok s dopadem 22:00:00 a útok šel minutu, můj návrat je 22:01:00 a jsem vyčasován na 115 ms a uhnu přes pomocníka rabování a boj proběhne, bojují moje jednotky ve vesnici a zároveň jsou na cestě odeslané přes pomocníka rabování. Následně stáhnu své jednotky a buď se můj počet jednotek sníží o jednotky které umřeli při obraně nebo se mi vracející jednotky z toho uhnutí přičtou k mým jednotkám doma.

Několikrát se nám takto podařilo znásobit jednotky i šlechtice ale opět, je to stejně nahodilá chyba jako jsi tu popsal výše ty. Já to mám vše zaevidováné a i trošku tuším, kde je chyba nicméně nikdo nemá zájem to opravit.

Je to už mrtvá hra, nikdo neblokuje hráče užívající zakázané skripty, je běžné že hráčům jede 24/7 klient na Selenium, rabují deseti až sta tisíce denně a nikdo s tím nic nedělá.

Při nových release je upravováno vše, jen né chyby ve hře.[/ispoiler]
 

Diktator Miloš

Nový uživatel
Registrovaný uživatel
Počet poděkování
9
Ano, úplně na to kašlou a nereagují na chyby, protože na tom nic nevydělají. Možná je tyto problémy pojmenovat jako Nápad na novou placenou funkci.

Tedy člověk, který si zaplatí funkci správného a předvídatelného počítání, může potom počítat s tím, jak by to mělo fungovat :-D

VOP
11.2 Je zakázáno využívat pro vlastní anebo cizí účely bugy či chyby v programování her a v jejich her, které mohou pro uživatele představovat určité zvýhodnění. Pokud objevíš nějaký bug, obratem nám to sdělíš. Pokud jsi z něj měl prospěch, je tento – pokud je to možné – třeba vrátit. Pokud bys bugy nebo chyby využíval záměrně, nebo pokud bys je zveřejnil na internetu či prostřednictvím mobilních aplikací, může to vést k okamžité výpovědi licenčního ujednání a smazání tvého účtu.
15.2 Nedostatky, které objevíš, je třeba neprodleně reklamovat. V zájmu doložitelnosti je vhodné takové nedostatky dokumentovat v textové formě (např. faxem, dopisem nebo e-mailem). Před nahlášením možné chyby si pročteš všechny stránky s nápovědou, často kladené dotazy a případná sdělení na diskuzních fórech.


Pravidla
Hráči jsou povinni informovat herní podporu o chybách a závadách hry hned, jak je objeví, nebo se o nich dozví. Pokud nebude chyba nebo závada bezprostředně nahlášena, zejména pokud někoho zvýhodňuje, může to vést k potrestání.


Je sranda, že v pravidlech i VOP je informace, že se mají hlásit chyby a podobně, ale když je nikdo neřeší a reálně to uživatelům poškozuje hru, protože se chová nepředvídatelně, je to naprosto v pořádku.
 

Kozmicz

Administrátor
Člen týmu
Administrátor
Počet poděkování
2.076
Některé herní chyby i přestože byly nahlášeny, tak naši vývojáři neopravili. Buď je to příliš složité a nebo by oprava chyby velkou pravděpodobností mohla rozbít jiné řetěžce, což by mohlo mít za následek daleko větší škody. Některé chyby, tak mohou být vývojáři v tomto smyslu ponechány.

Hráč je povinnen nahlásit chybu, to zda chyba bude vývojáři opravena již hráč ani herní support neovlivní.
Některé herní prvky a výpočty nejsou hráčům veřejné, takže v některých případech to může být otázkou diskuze, testování hráčů a předávání si zkušeností.
 

Diktator Miloš

Nový uživatel
Registrovaný uživatel
Počet poděkování
9
Některé herní chyby i přestože byly nahlášeny, tak naši vývojáři neopravili. Buď je to příliš složité a nebo by oprava chyby velkou pravděpodobností mohla rozbít jiné řetěžce, což by mohlo mít za následek daleko větší škody. Některé chyby, tak mohou být vývojáři v tomto smyslu ponechány.

Hráč je povinnen nahlásit chybu, to zda chyba bude vývojáři opravena již hráč ani herní support neovlivní.
Některé herní prvky a výpočty nejsou hráčům veřejné, takže v některých případech to může být otázkou diskuze, testování hráčů a předávání si zkušeností.

Ok, děkuji za odpověď. Takže oprava klíčové části hry není prostě důležitá, raději vymýšlení nových Premium nesmyslů. Bylo by dobré vytvořit nějaký seznam známých chyb, které se nebudou řešit. Tohle totiž není o výpočtu ani ničem jiném, je to prostě chyba!

A pokud se tato chyba nemá v plánu opravovat, tak by bylo dobré o tom někde informovat, ať není potřeba teda hlásit dle pravidel a podmínek.

Každopádně skvělý přístup a ještě jednou děkuji.
 
Nahoru