Diskuze: Psaní do konzole hry z jiné aplikace

C# .NET .NET (C# a Visual Basic) Psaní do konzole hry z jiné aplikace American English version English version

Avatar
denoy
Člen
Avatar
denoy:

Zdravím,

mám teoretickou otázku, lze nějak u her většího formátu psát do konzole z jiných aplikací? Psát je asi blbě zvolené slovo, nejlepší bude asi "zasimulovat" příkaz v konzoli, ptám se z hlediska těch her, jak je konzole vůbec řešená. Je mi jasné, že to každá hra bude mít asi jinak, do her vůbec nedělám, tak se ptám jestli to je vůbec možné, aby to vývojáři her udělali tak, aby to šlo. Díky moc za rady!

(Pro ty, co se v tom vyznají, jedná se o hru titulu half-life)

 
Odpovědět 29.1.2013 20:44
Avatar
Odpovídá na denoy
Luboš Běhounek (Satik):

Samozřejmě, nejjednodušší je simulovat stisk kláves.

Nahoru Odpovědět 29.1.2013 20:56
:)
Avatar
denoy
Člen
Avatar
denoy:

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.

 
Nahoru Odpovědět 29.1.2013 21:11
Avatar
Odpovídá na denoy
Luboš Běhounek (Satik):

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áčů).

Nahoru Odpovědět 29.1.2013 23:15
:)
Avatar
matesax
Redaktor
Avatar
matesax:

K čemu simulovat klávesy, když chceš jasný příkaz? Uděláš si objekt odesílací a přijímací - přes co - to máš hafo možností...

 
Nahoru Odpovědět 30.1.2013 5:58
Avatar
denoy
Člen
Avatar
denoy:

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"

 
Nahoru Odpovědět  +2 30.1.2013 15:35
Avatar
TomBen
Redaktor
Avatar
Odpovídá na denoy
TomBen:

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.

Nahoru Odpovědět  +6 30.1.2013 16:14
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
matesax
Redaktor
Avatar
matesax:

Nemám konkrétní případ, tak jak asi mohu poradit. Ale tahat knihovny atd. To je ideál... Opravdu nebude lepší zadávat rovnou příkazy...

 
Nahoru Odpovědět 30.1.2013 16:45
Avatar
denoy
Člen
Avatar
denoy:

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)

 
Nahoru Odpovědět 30.1.2013 16:48
Avatar
denoy
Člen
Avatar
denoy:

matesax nemáš konkrétní případ čeho? Protože já uvedl, externí aplikace vůči hře, hra je titulu half-life, ty mají společný engine, potřebuji zavolat příkaz do konzole, co je na tom nekonkrétního? Mám uvést, konzole má zelenou barvu?

 
Nahoru Odpovědět 30.1.2013 16:57
Avatar
Odpovídá na matesax
Luboš Běhounek (Satik):

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á...

Nahoru Odpovědět 30.1.2013 17:03
:)
Avatar
matesax
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
matesax:

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#:

http://msdn.microsoft.com/…ys.send.aspx

Editováno 30.1.2013 17:13
 
Nahoru Odpovědět 30.1.2013 17:12
Avatar
Odpovídá na denoy
Luboš Běhounek (Satik):

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/…top/ms644950(v=vs.85).aspx

Nahoru Odpovědět 30.1.2013 17:16
:)
Avatar
Odpovídá na matesax
Luboš Běhounek (Satik):

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.

Nahoru Odpovědět 30.1.2013 17:21
:)
Avatar
matesax
Redaktor
Avatar
matesax:

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...

Editováno 30.1.2013 17:25
 
Nahoru Odpovědět 30.1.2013 17:23
Avatar
Odpovídá na matesax
Luboš Běhounek (Satik):

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."

Editováno 30.1.2013 17:40
Nahoru Odpovědět 30.1.2013 17:39
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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á.

Nahoru Odpovědět 30.1.2013 17:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na matesax
Fugiczek:

Jako obvykle zde píšeš z cesty. Proč se vůbec snažíš když nemáš s čím by jsi zde přispěl?

 
Nahoru Odpovědět 30.1.2013 17:44
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Dnes už je poměrně málo programů kompilovaných do strojového jazyka.

Nahoru Odpovědět 30.1.2013 17:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

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).

Nahoru Odpovědět 30.1.2013 17:47
:)
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

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++.

Editováno 30.1.2013 17:49
Nahoru Odpovědět 30.1.2013 17:49
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

V C/C++ se dnes už dělá jen herní engine. Hra samotná už běží v interpretru tohoto virtuálního stroje.

Nahoru Odpovědět 30.1.2013 17:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Vím že to není úplně k tématu, ale zároveň trochu je :D. 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 :D. 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 :D

Nahoru Odpovědět 30.1.2013 18:39
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
denoy
Člen
Avatar
denoy:

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)

 
Nahoru Odpovědět 30.1.2013 20:10
Avatar
denoy
Člen
Avatar
denoy:

Counter-Strike 1.6

 
Nahoru Odpovědět 30.1.2013 21:08
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na denoy
Fugiczek:

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í.

 
Nahoru Odpovědět 30.1.2013 21:12
Avatar
Odpovídá na denoy
Luboš Běhounek (Satik):

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čí? :)

Nahoru Odpovědět 30.1.2013 21:17
:)
Avatar
denoy
Člen
Avatar
denoy:

Takové nastavení tam není, to by pro mě bylo až moc snadně a co je snadné je vždycky špatně :D

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í :)

 
Nahoru Odpovědět 30.1.2013 21:55
Avatar
Odpovídá na denoy
Luboš Běhounek (Satik):

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.

Nahoru Odpovědět 30.1.2013 22:05
:)
Avatar
denoy
Člen
Avatar
denoy:

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.

 
Nahoru Odpovědět 30.1.2013 22:12
Avatar
Зайчик
Člen
Avatar
Odpovídá na denoy
Зайчик:

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.

Nahoru Odpovědět 30.1.2013 23:09
Коммунизм для нашего будущего!
Avatar
Odpovídá na Зайчик
Luboš Běhounek (Satik):

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.

Nahoru Odpovědět 30.1.2013 23:21
:)
Avatar
Зайчик
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Зайчик:

mě bylo jasné že to nepůjde no :) to by byla jiná sranda si pak zahrát :D

Nahoru Odpovědět 30.1.2013 23:26
Коммунизм для нашего будущего!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 34 zpráv z 34.