Diskuze: Psaní do konzole hry z jiné aplikace
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 34 zpráv z 34.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Samozřejmě, nejjednodušší je simulovat stisk kláves.
Teď jsi mi vnukl úplně novou myšlenku, která by mi pokryla asi 90% problému, ale když daný příkaz, který potřebuji zavolat nebude mít hráč nabindovaný, tak pro mě simulace jakéhokoliv tlačítka padá, každopádně za tu simulaci klávesy Ti děkuju, protože jsi mi dal alternativu, pokud nedocílím simulace rovnou příkazu v konzoli.
Cokoliv se dá bindovat se dá volat i přes konzoli, třeba "+attack" je to samé, jako stisk levého myšítka (u většiny hráčů).
matesax možná jsem pako, ale nechápu co bych měl udělat, za 1. se mi honilo hlavou "kam sakra a co mám odesílat nějakým objektem ??", za 2. "A co tím objektem budu přijímat, to má každá konzole v každé hře zpětnou vazbu?". Jak jsem psal výše, tohle jsem nikdy nedělal, takže jsi mi jenom napsal ,,postav dům bez nákresu"
Z toho si nic nedělej. Tohle on dělá pořád.
Obvykle v tomto pořadí: machruje, hádá se, uráží se.
Ale že by zkusil někomu fakt pomoct..
Dokud peklo nezamrzne a on nezmění přístup je asi lepší ho ignorovat.
Tak asi budu muset využít simulaci kláves, dnes jsem vyzkoušel napsat
jednoduchý script, timer co 5 sekund volal sendkey na F1, na F1 jsem měl
nabindováno vypnutí hry, ale hrá se ne a ne vypnout, zkusil jsem potom i
tento - http://www.codeproject.com/…ication-in-C
Také bez výsledku, hra je fullscreen opengl, má na to simulace kláves
nějaký vliv?
(Ve windowsu, když jsem si otevřel nějaké editor, tak se normálně otevřela nápověda, ale ve hře se neprovedlo nic)
Můžeš nasimulovat namačkání celé sekvence znaků - třeba právě zíměného příkazu "+attack" nebo můžeš taky takto automaticky hráči i něco nabindovat a pak používat ten bind, obávám se, že jednoduchá přímější cesta k získání kontroly nad ovládáním, než simulování stisků kláves, už není.
Matesax: Když o něčem nemáš ani představu, tak se k tomu radši nevyjadřuj, Half-Life není opensource a aby se mohl na konzoli napíchnout přímo nějak programově, musel ty tebou zmiňované knihovny disassemblovat (a s největší pravděpodobností i poupravit), což asi nebude ta cesta, kterou denoy hledá...
Tu informaci dal dolů jako dodatek. Jinak je to celé obecné. A obecně bych si udělal spíše přímou komunikaci, která tím bude bezpečnější, cílenější, atd. Samozřejmě vy se do mě musíte navážet a udělat ze mě co největšího debila.
Já tak strašně rád machruji - nemohl bych bez toho žít... Obecně se tu vytahuji kdovíjakými informacemi, přitom jsem nenapsal nic, čím bych se povyšoval...
Ale kdo tu udělal něco špatně je autor postu. Když tak jasně ví, že chce simulovat klávesy, proč to nenapíše rovnou? Protože pak jsem měl právo upozornit, že je lepší udělat si komunikaci mezi aplikacemi, než se vydávat všanc všem ostatním procesům...
Tady máš odkaz od debila, co nerozumí C#:
Záleží na tom, jak mají řešené zjišťování stisklých kláves - u některých postupů nemusejí některé metody fungovat.
Pokud sendkeys nefunguje, zkusil bych to třeba přes WINAPI:
http://msdn.microsoft.com/…=vs.85).aspx
Ano, to je pro denoye děsně užitečné vědět, jak to udělat, kdyby by
to řešil obecně, když to chce pro jednu konkrétní aplikaci (hru) .
V prvním postu ještě nevěděl, že to bude chtít řešit stiskem kláves, protože nevěděl, jestli nejsou jiný možnosti, jak to vyřešit.
Btw ten příkaz z tvého odkazu o pár příspěvků výš denoy popisuje, že mu to nefunguje.
Já osobně bych nechtěl, aby se mi někdo montoval do programu - jelikož by mohl podvádět atd... Takže kdo ví, jak to mají obfousované.
Takže mi sám tvrdíš, že jsem byl v právu. Kdo tu tedy machruje a uráží ostatní? Sám si napsal, že hledal jiné řešení - které jsem mu dal. Hry nehraji, takže pro mě bylo prioritní hlavní téma, ne něco v závorce - jako doplňovací informace...
Kompilované programy (do strojového jazyka) se většinou neobfuskují - není to potřeba.
Nevkládej mi do úst (do prstů) něco, co jsem neřekl - kde jsem tu napsal, že machruješ nebo urážíš ostatní?
Nemůžu si pomoct, ale některé tvoje řešení mi připadají, jako kdyby by se tě někdo zeptal "Kde se dá koupit toaletní papír?" a ty bys mu odpověděl "Když bych chtěl napsat dopis, objednal bych si plnej náklaďák."
Pokud by hráč mohl podvádět při znalosti zdrojových kódů, bylo by to asi chybně napsáno. Spousta her je včetně zdrojových kódů a podvádět se v nich nedá.
Jako obvykle zde píšeš z cesty. Proč se vůbec snažíš když nemáš s čím by jsi zde přispěl?
Dnes už je poměrně málo programů kompilovaných do strojového jazyka.
Přesně tak, v multiplayerové hře musí být všechno ošetřeno na straně serveru (na straně klienta by to v rámci ulehčení zátěže serveru mělo být ošetřeno samozřejmě taky).
Většina desktopových (AAA) her se mezi ně ještě řadí, velké společnosti ještě stále často programují v C/C++.
V C/C++ se dnes už dělá jen herní engine. Hra samotná už běží v interpretru tohoto virtuálního stroje.
Vím že to není úplně k tématu, ale zároveň trochu je . Ve škole spolužák zkoušel
udělat program, který online přeposílá signály do jiného počítače,
stisknuté klávesy, myš apod. Fungovalo to celkem v pořádku, stisknuté
klávesy tahal úplně někde ze systému a tak jsme si mysleli že by to mohlo
fungovat přímo ve hře. Rádi si občas něco zahrajem, a takováhle aplikace
u nic netušícího člověka by dokázalo udělat celkem dobrou zábavu při
dobře rozehraném zápase
.
Abych to shrnul, klávesy se posílaly a mačkali dobře jenom přímo ve
Windows nebo přímo nějakých aplikacích (poznámkový blok, IE, word) ale v
hrách či složitějších programech ne.Kód teď nejsem schopnej dodat a
nevím jestli ho spolužák ješět má, je to delší doba co to zkoušel. Ve
finále ani nevím pořádně proč to sem píšu
Zirko, také mi to nejde, zkoušel jsem od obyčejného kódu až po externí funkce dokonce jsem našel i nějakou knihovnu přímo na simulaci stisku kláves (Vše zde zmíněné jsem zkoušel) a stejně hra na ty klávesy nereaguje, což mě mrzí ..
Co nějaké další řešení? Napadá někoho? Nějaký hook té hry a něco tam by se provádět nešlo? (Abych pravdu řekl, nikdy jsem žádný proces nehookoval, takže nevím co se dá s hookem dělat a co jim docílím, ani jsem ho doteď nijak nepotřeboval)
Hookem můžeš dosáhnout spousty věcí. S hookem mám zkušenosti jen z javy, ale v C# to bude určitě obdobné. Budeš potřebovat metody z User32 na najití procesu, respektive jeho ID/Pointer. Dále metody z Kernel32 na otevření a zavření toho procesu a jeho úpravu. Podrobněji ti to neřeknu, záleží přesně na hře a musíš si zjistit nejspíš i pointery na tu konzoli, nebo zjistit adresy, které posílají někam na zpracování údaje z konzole a posílat tam svoje vlastní.
Tuším, že někde v cs 1.6 se dalo nastavit, jak má hra přijímat vstup, jestli přes DXInput nebo normálně (přes winapi), není tam někde takové zaškrtávátko někde v menu?
A k čemu to vlastně potřebuješ - bindování ti nestačí?
Takové nastavení tam není, to by pro mě bylo až moc snadně a co je
snadné je vždycky špatně
Satik, potřebuji ten bind zavolat, aniž by o tom uživatel věděl,
přesněji příkaz na vytvoření screenu, ten bych si vytáhl a nahrál na
web. Mám teď od jednoho programátora funkci na hook procesu a vytvoření
screenshotu, ale vytvoří to screen jen 1/5 hráčům a já nevím proč, autor
mi píše nějaké nastavení s ovladači u klienta špatně, mu to jede dál to
neřeší, klasika .. takže hledám nějaké jiné řešení
Hádám - ostatní mají černou obrazovku?
Řešením by mohlo být spouštět cs v režimu kompatibility - zaškrtnout zakázat motivy plochy a tuším, že i zakázat kompozici plochy.
Právě že ne, černá obrazovka byla vždy u win7, když se ukládalo pouze popředí obrazovky do obyčejné bitmapy, tu aplikaci kterou mám, ta se přímo nahookuje do hry a vyfotí nějakou renderovací smyčku kterou tam hra má, psal i něco s frambufferem, ale prostě některým to screen ani nevytvoří, mě třeba ano, kolegovi na PC co jsem to zkoušel nevytvoří nic.
Ahoj, teď mě tak napadlo k tomuhle tématu... nejspíš to tobě vůbec nepomůže to je spíš moje zvědavost. Nedala by se ze hry nějak zachytit odeslaná data? A třeba pomocí té konzolové aplikaci je upravit? Dejme tomu že někoho ve hře zasáhnu a odešle se packet na server "že jsem vystřelil do místa x,y nějaký vlastně náboj" a na serveru se data zpracují a vypočítá se jestli tam někdo stál a pokud ano dá mu to určitý damage. Myslíte že by mohlo i jít odchytit nějak ten packat a poslat ho třeba 6x? Tím by vzniknul vlastně takový "hack" v normálním případe by to bylo tak že by do toho místa kde někdo stojí uhodilo třeba 50damage a s tímhle by to do hráče dalo 300damage a tím by ho to zabilo vlastně na jednu ránu.
Pakety mají uvnitř většinou nějaké číslování, takže by nestačilo jen poslat ho 6x, ale musely by se asi i upravit pořadová čísla, aby to server nepovažoval ze jeden paket.
Druhý problém je v tom, že na serveru se všechno kontroluje - pokud
třeba má zbraň kadenci 2 rány za sekundu a na server přijde pro jeden čas
10 střel, tak to taky neprojde (aspoň by nemělo ).
A když se pakety pošlou s časy posunutými dozadu, aby to vyhovovalo, tak tam zase může být kontrola, jestli bylo možné v tu dobu soupeře trefit a třeba pakety starší než vteřinu se mohou zahazovat apod.
mě bylo jasné že to nepůjde no to by byla jiná sranda si pak zahrát
Zobrazeno 34 zpráv z 34.