Jamlegend C++ Bot



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum Projekte verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • schaut einfach aus, ist also wohl nur eine frage der bezahlung 😉



  • Ja also ich würde auch zahlen und da es ja leicht aussieht muss es ja auch nicht viel sein 😃 oder??

    ich erklär ma was der bot machen sollte :
    Hier erst ma zwei links zu zwei songs
    http://www.jamlegend.com/song/302/1251/
    in diesem songs werden hauptsächlich hammerons benutzt das sind die noten in denen so etwas blinkt (sowas wie ein stern)
    diese noten muss man nicht mit enter bestätigen aber die noten in denen diese nicht sind die muss man mit enter bestätigen
    also : man muss immer den jeweiligen key drücken 1,2,3,4oder 5 und dazu die noten mit enter bestätigen(die die nicht blinken)

    es gibt beat jam das hier: http://1000ff.de/img/screenshot_jamlegend.jpg
    und guitar jam das hier : http://www.pault.de/wp-content/uploads/2009/01/jamlegend.png

    der bot sollte hauptsächlich für guitar jam sein..
    hoffe du könntest mir so schnell wie möglich einen bot coden
    🙂

    MfG drachlen



  • niemand will einen bot machen ??
    anscheinend doch nicht so leicht 😃



  • drachlen schrieb:

    niemand will einen bot machen ??
    anscheinend doch nicht so leicht 😃

    falls falls du gewinnen willst, wuerde es dich billiger kommen Roxanne auf ein date einzuladen und sie betrunken zu machen bevor du sie an den computer fesselst und gegen sie zoggst, als hier jemanden zu bezahlen 😉
    Der preis richtet sich nach angebot/nachfrage, nicht nach schwierigkeit, solange du das selbst nicht kannst :p



  • Ja also ich würde auch zahlen und da es ja leicht aussieht muss es ja auch nicht viel sein 😃 oder??

    Was ist nicht viel? Ein paar Stunden wird man da allemal dransitzen (zumindest ich).



  • dann nimm dir die stunden zeit und dann bekommse von mir nen haufen geld... achja roxanne ...gegen die gewinn ich ehschon immer 😃



  • ich probiere mich einfach mal selbst dran...^^
    könnte mir denn vielleicht einer von euch sagen wie man einen bestimmten pixel auf die farbe kontrolieren kann und wenn die farbe sich verändert eine bestimmte taste drückt??

    das wär ja eigentlich auch alles was ich für so einen bot bräuchte.

    😃

    Danke





  • Hatte gerade lust sowas zu basteln.

    Anpassen und zum laufen bekommen musste es aber selber, ist für die beatjam version. Hat noch ein paar kleine bugs (ka ob das am programm oder flash liegt) aber läuft generell schon recht gut. Ist eher ne kalibrierungssache. Habs unter 1280x1024 gebaut (opera).

    viel spass.

    // JamBot is a bot especially for http://www.jamlegend.com
    // it uses simple color detection for actions
    
    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    #include <utility>
    
    #define VK_1 0x31
    #define VK_2 0x32
    #define VK_3 0x33
    #define VK_4 0x34
    #define VK_5 0x35
    
    struct Vector2D
    {
    	Vector2D() {}
    	Vector2D(float x, float y)
    	{
    		this->x = x;
    		this->y = y;
    	}
    	float x, y;
    };
    
    struct Vector3D
    {
    	Vector3D() {}
    	Vector3D(float x, float y, float z)
    	{
    		this->x = x;
    		this->y = y;
    		this->z = z;
    	}
    	float x, y, z;
    };
    
    struct Button
    {
    	Button(COLORREF c, COLORREF hc, Vector2D p, Vector2D hp, int k)
    	{
    		color = c;
    		holdColor = hc;
    		pos = p;
    		holdPos = hp;
    		locktime = 0;
    		down = false;
    		key = k;
    	}
    
    	COLORREF color;
    	COLORREF holdColor;
    
    	Vector2D pos;
    	Vector2D holdPos;
    	unsigned long locktime;
    	bool down;
    	int key;
    };
    
    class Window
    {
    public:
    	Window()
    	{
    		hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    		hWnd = FindWindow("OperaWindowClass", NULL);
    		Init();
    		Run();
    	}
    
    	~Window()
    	{
    		DeleteDC(hDC);
    	}
    private:
    	COLORREF GetColor(Vector2D pos, int rows , int cols)
    	{
    		Vector3D rgb;
    		int counter = 0;
    
    		if (rows == 0 || cols == 0)
    		{
    			return GetPixel(hDC, (int)pos.x, (int)pos.y);
    		}
    
    		// row oder col == 1 -> -1, 0, 1, == 2 -> -2, -1, 0, 1, 2
    		for (int y = -cols; y <= cols; y++)
    		{
    			for (int x = -rows; x <= rows; x++)
    			{
    				COLORREF color = GetPixel(hDC, (int)pos.x + x, (int)pos.y + y);
    
    				rgb.x += GetRValue(color);
    				rgb.y += GetGValue(color);
    				rgb.z += GetBValue(color);
    
    				counter++;
    			}
    		}
    
    		rgb.x /= counter;
    		rgb.y /= counter;
    		rgb.z /= counter;
    
    		return RGB(rgb.x, rgb.y, rgb.z);
    	}
    
    	void Init()
    	{
    		buttons.push_back(Button(RGB(255, 236, 136), RGB(255, 247, 51),  Vector2D(549, 480), Vector2D(552, 465), VK_1)); // gelb
    		buttons.push_back(Button(RGB(236, 148, 255), RGB(246, 96, 254),  Vector2D(589, 480), Vector2D(592, 465), VK_2)); // lila
    		buttons.push_back(Button(RGB(198, 255, 130), RGB(201, 255, 50),  Vector2D(629, 480), Vector2D(632, 465), VK_3)); // grün
    		buttons.push_back(Button(RGB(255, 146, 134), RGB(255, 97, 100),  Vector2D(669, 480), Vector2D(672, 465), VK_4)); // rot
    		buttons.push_back(Button(RGB(151, 211, 247), RGB(146, 246, 255), Vector2D(711, 480), Vector2D(712, 465), VK_5)); // blau
    	}
    
    	bool IsColorSimilar(COLORREF c1, COLORREF c2, int maxDistance)
    	{
    		byte r1 = GetRValue(c1);
    		byte r2 = GetRValue(c2);
    
    		byte g1 = GetGValue(c1);
    		byte g2 = GetGValue(c2);
    
    		byte b1 = GetBValue(c1);
    		byte b2 = GetBValue(c2);
    
    		// größer dem kleineren und kleiner dem größeren
    		if (r1 <= Clamp(r2 + maxDistance, 0, 255) && 
    			r1 >= Clamp(r2 - maxDistance, 0, 255) &&
    
    			g1 <= Clamp(g2 + maxDistance, 0, 255) &&
    			g1 >= Clamp(g2 - maxDistance, 0, 255) &&
    
    			b1 <= Clamp(b2 + maxDistance, 0, 255) &&
    			b1 >= Clamp(b2 - maxDistance, 0, 255))
    		{
    			return true;
    		}
    		return false;
    	}
    
    	bool HasToHold(Button &b)
    	{
    		COLORREF lineColor = GetColor(b.holdPos, 0, 0);
    
    		if (IsColorSimilar(lineColor, b.holdColor, 60))
    		{
    			return true;
    		}
    
    		return false;
    	}
    
    	void Run()
    	{
    		// better sleep
    		timeBeginPeriod(1);
    
    		while (true)
    		{
    			for(size_t i = 0; i < buttons.size(); i++)
    			{
    				Button &b = buttons[i];
    
    				COLORREF targetColor = GetColor(b.pos, 2, 1);
    
    				bool isSimilar = IsColorSimilar(targetColor, b.color, 30);
    
    				if (isSimilar && !b.down/* && (b.locktime + 90) < timeGetTime() */)
    				{
    					keybd_event(b.key, 0, 0, 0);
    					// press enter at the same time
    					//keybd_event(0xD, 0, 0, 0);
    					b.down = true;
    					b.locktime = timeGetTime();
    				}
    				else if(!isSimilar && b.down && /*(b.locktime + 50) < timeGetTime() && */!HasToHold(b))
    				{
    					//keybd_event(0xD, 0, KEYEVENTF_KEYUP, 0);
    					keybd_event(b.key, 0, KEYEVENTF_KEYUP, 0);					
    					b.down = false;
    				}
    			}
    
    			Sleep(10);
    		}
    	}
    
    	int Clamp(int val, int min, int max)
    	{
    		return max(min, min(val, max));
    	}
    
    	HDC hDC;
    	HWND hWnd;
    	std::vector<Button> buttons;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Window wnd;
    	return 0;
    }
    


  • also wenn ich den code compilieren will kommen 37 errors ... ich benutze dev-c++
    hier ma der log

    Compiler: Default compiler
    Executing g++.exe...
    g++.exe "C:\Users\Philipp\Desktop\Untitled1.cpp" -o "C:\Users\Philipp\Desktop\Untitled1.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
    C:\Users\Philipp\Desktop\Untitled1.cpp:4:21: stdafx.h: No such file or directory
    C:\Users\Philipp\Desktop\Untitled1.cpp:40: error: expected `)' before "c"

    C:\Users\Philipp\Desktop\Untitled1.cpp:51: error: COLORREF' does not name a type C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:52: error:COLORREF' does not name a type
    C:\Users\Philipp\Desktop\Untitled1.cpp:77: error: COLORREF' does not name a type C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:118: error: expected;' before '(' token
    C:\Users\Philipp\Desktop\Untitled1.cpp:144: error: expected ;' before "bool" C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:196: error:HDC' does not name a type
    C:\Users\Philipp\Desktop\Untitled1.cpp:197: error: HWND' does not name a type C:\\Users\\Philipp\\Desktop\\Untitled1.cpp: In constructorWindow::Window()':
    C:\Users\Philipp\Desktop\Untitled1.cpp:66: error: hDC' undeclared (first use this function) C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:66: error: (Each undeclared identifier is reported only once for each function it appears in.) C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:66: error:CreateDC' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp:67: error: hWnd' undeclared (first use this function) C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:67: error:FindWindow' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp: In destructor Window::~Window()': C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:74: error:hDC' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp:74: error: DeleteDC' undeclared (first use this function) C:\\Users\\Philipp\\Desktop\\Untitled1.cpp: In member functionvoid Window::Init()':
    C:\Users\Philipp\Desktop\Untitled1.cpp:111: error: `RGB' undeclared (first use this function)

    C:\Users\Philipp\Desktop\Untitled1.cpp: In member function bool Window::HasToHold(Button&)': C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:146: error:COLORREF' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp:146: error: expected ;' before "lineColor" C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:148: error:lineColor' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp:148: error: 'struct Button' has no member named 'holdColor'

    C:\Users\Philipp\Desktop\Untitled1.cpp:148: error: IsColorSimilar' undeclared (first use this function) C:\\Users\\Philipp\\Desktop\\Untitled1.cpp: In member functionvoid Window::Run()':
    C:\Users\Philipp\Desktop\Untitled1.cpp:159: error: timeBeginPeriod' undeclared (first use this function) C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:167: error:COLORREF' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp:167: error: expected ;' before "targetColor" C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:169: error:targetColor' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp:169: error: 'struct Button' has no member named 'color'
    C:\Users\Philipp\Desktop\Untitled1.cpp:169: error: IsColorSimilar' undeclared (first use this function) C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:173: error:keybd_event' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp:177: error: `timeGetTime' undeclared (first use this function)

    C:\Users\Philipp\Desktop\Untitled1.cpp:182: error: KEYEVENTF_KEYUP' undeclared (first use this function) C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:187: error:Sleep' undeclared (first use this function)
    C:\Users\Philipp\Desktop\Untitled1.cpp: In member function int Window::Clamp(int, int, int)': C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:193: error:min' cannot be used as a function
    C:\Users\Philipp\Desktop\Untitled1.cpp:193: error: max' cannot be used as a function C:\\Users\\Philipp\\Desktop\\Untitled1.cpp: At global scope: C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:202: error:_TCHAR' has not been declared
    C:\Users\Philipp\Desktop\Untitled1.cpp:203: error: ISO C++ forbids declaration of `argv' with no type

    Execution terminated

    ich benutze dev-c++ erst seit kurzem .
    liegt es vielleicht am programm kennt ihr ein besseres??



  • Ja, z.B. Eclipse mit C++ plugin oder VisualStudio EE



  • Du brauchst die windows.h. Solltest du als erstes includen um Fehler zu vermeiden. Und musst gegebenenfalls auch noch die libs user32.lib und gdi32.lib linken.

    edit:
    Und die winmm.lib.



  • so hab jetzt windows.h included
    doch jetzt sind noch zwei errors da ..
    hier der log

    Compiler: Default compiler
    Executing g++.exe...
    g++.exe "C:\Users\Philipp\Desktop\Untitled1.cpp" -o "C:\Users\Philipp\Desktop\Untitled1.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
    C:\Users\Philipp\Desktop\Untitled1.cpp: In member function `int Window::Clamp(int, int, int)':

    C:\Users\Philipp\Desktop\Untitled1.cpp:194: error: min' cannot be used as a function C:\\Users\\Philipp\\Desktop\\Untitled1.cpp:194: error:max' cannot be used as a function

    Execution terminated

    muss stdafx.h unbedingt included werden??



  • Dann fehlt dir noch ein Makro für min/max:

    #define max(a,b)	(((a) > (b)) ? (a) : (b))
    #define min(a,b)	(((a) < (b)) ? (a) : (b))
    


  • ok klappt aber jetzt neue fehler meldungen 😃 🙂

    LOG:

    (edit) jetzt siehts nur noch so aus :

    Compiler: Default compiler
    Building Makefile: "C:\Dev-Cpp\Makefile.win"
    Executing make...
    make.exe -f "C:\Dev-Cpp\Makefile.win" all
    g++.exe -c ../Users/Philipp/Desktop/main.cpp -o ../Users/Philipp/Desktop/main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

    g++.exe ../Users/Philipp/Desktop/main.o -o "Project1.exe" -L"C:/Dev-Cpp/lib" -mwindows

    ../Users/Philipp/Desktop/main.o:main.cpp:(.text_ZN6Window3RunEv[Window::Run()]+0xf): undefined reference to `timeBeginPeriod@4' ../Users/Philipp/Desktop/main.o:main.cpp:(.text_ZN6Window3RunEv[Window::Run()]+0xe9): undefined reference to `timeGetTime@0'
    collect2: ld returned 1 exit status

    make.exe: *** [Project1.exe] Error 1

    Execution terminated



  • Sicher das du die "winmm.lib" gelinkt hast, kuck doch mal in den Projekt Einstellungen.

    In VisualStudio kann man es auch ganz einfach mit

    #pragma comment(lib, "winmm.lib")
    

    weißt nicht ob das bei anderen Compilern auch geht.



  • so habs geschafft ..
    es läuft

    👍 😃 😃 😃

    nur ma ne frage is der bot nicht vielleicht schneller wenn der nicht nach einer bestimmten farbe sucht sonder einfach wartet bis sich die grundfarbe verändert??
    weil die richtig harten songs bekommt der nicht hin
    aber der ist 1000 mal so gut wie der autoit bot 😃



  • Poste mal bitte ein paar links welche nicht gehen 🙂

    Weil sowas wie Airborne oder Flight of the Bumblebees hab ich zu 100% Hit.
    [edit]
    Auf Legendary



  • was 😮
    also bei mir schafft der bot bei flight of the bumblebee nur das intro dann kackt der ab 😃
    und an meinen laptop kanns nicht liegen da der eigentlich ganz gut ist 🙄
    und 100% kriegt der so gut wie nie da er manchmal auch bei total leichten noten nicht die taste sendet

    vielleicht hab ich den quelltext verändert hier ist er nochma :

    // JamBot is a bot especially for http://www.jamlegend.com 
    // it uses simple color detection for actions 
    
    #include "stdafx.h"
    #include <windows.h>
    #include <iostream> 
    #include <vector> 
    #include <utility>
    #pragma comment(lib, "winmm.lib")
    
    #define VK_1 0x31 
    #define VK_2 0x32 
    #define VK_3 0x33 
    #define VK_4 0x34 
    #define VK_5 0x35 
    
    struct Vector2D 
    { 
        Vector2D() {} 
        Vector2D(float x, float y) 
        { 
            this->x = x; 
            this->y = y; 
        } 
        float x, y; 
    }; 
    
    struct Vector3D 
    { 
        Vector3D() {} 
        Vector3D(float x, float y, float z) 
        { 
            this->x = x; 
            this->y = y; 
            this->z = z; 
        } 
        float x, y, z; 
    }; 
    
    struct Button 
    { 
        Button(COLORREF c, COLORREF hc, Vector2D p, Vector2D hp, int k) 
        { 
            color = c; 
            holdColor = hc; 
            pos = p; 
            holdPos = hp; 
            locktime = 0; 
            down = false; 
            key = k; 
        } 
    
        COLORREF color; 
        COLORREF holdColor; 
    
        Vector2D pos; 
        Vector2D holdPos; 
        unsigned long locktime; 
        bool down; 
        int key; 
    }; 
    
    class Window 
    { 
    public: 
        Window() 
        { 
            hDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); 
            hWnd = FindWindow(_T("OperaWindowClass"), NULL); 
            Init(); 
            Run(); 
        } 
    
        ~Window() 
        { 
            DeleteDC(hDC); 
        } 
    private: 
        COLORREF GetColor(Vector2D pos, int rows , int cols) 
        { 
            Vector3D rgb; 
            int counter = 0; 
    
            if (rows == 0 || cols == 0) 
            { 
                return GetPixel(hDC, (int)pos.x, (int)pos.y); 
            } 
    
            // row oder col == 1 -> -1, 0, 1, == 2 -> -2, -1, 0, 1, 2 
            for (int y = -cols; y <= cols; y++) 
            { 
                for (int x = -rows; x <= rows; x++) 
                { 
                    COLORREF color = GetPixel(hDC, (int)pos.x + x, (int)pos.y + y); 
    
                    rgb.x += GetRValue(color); 
                    rgb.y += GetGValue(color); 
                    rgb.z += GetBValue(color); 
    
                    counter++; 
                } 
            } 
    
            rgb.x /= counter; 
            rgb.y /= counter; 
            rgb.z /= counter; 
    
            return RGB(rgb.x, rgb.y, rgb.z); 
        } 
    
        void Init() 
        { 
            buttons.push_back(Button(RGB(255, 236, 136), RGB(255, 247, 51),  Vector2D(549, 480), Vector2D(552, 465), VK_1)); // gelb 
            buttons.push_back(Button(RGB(236, 148, 255), RGB(246, 96, 254),  Vector2D(589, 480), Vector2D(592, 465), VK_2)); // lila 
            buttons.push_back(Button(RGB(198, 255, 130), RGB(201, 255, 50),  Vector2D(629, 480), Vector2D(632, 465), VK_3)); // grün 
            buttons.push_back(Button(RGB(255, 146, 134), RGB(255, 97, 100),  Vector2D(669, 480), Vector2D(672, 465), VK_4)); // rot 
            buttons.push_back(Button(RGB(151, 211, 247), RGB(146, 246, 255), Vector2D(711, 480), Vector2D(712, 465), VK_5)); // blau 
        } 
    
        bool IsColorSimilar(COLORREF c1, COLORREF c2, int maxDistance) 
        { 
            byte r1 = GetRValue(c1); 
            byte r2 = GetRValue(c2); 
    
            byte g1 = GetGValue(c1); 
            byte g2 = GetGValue(c2); 
    
            byte b1 = GetBValue(c1); 
            byte b2 = GetBValue(c2); 
    
            // größer dem kleineren und kleiner dem größeren 
            if (r1 <= Clamp(r2 + maxDistance, 0, 255) && 
                r1 >= Clamp(r2 - maxDistance, 0, 255) && 
    
                g1 <= Clamp(g2 + maxDistance, 0, 255) && 
                g1 >= Clamp(g2 - maxDistance, 0, 255) && 
    
                b1 <= Clamp(b2 + maxDistance, 0, 255) && 
                b1 >= Clamp(b2 - maxDistance, 0, 255)) 
            { 
                return true; 
            } 
            return false; 
        } 
    
        bool HasToHold(Button &b) 
        { 
            COLORREF lineColor = GetColor(b.holdPos, 0, 0); 
    
            if (IsColorSimilar(lineColor, b.holdColor, 60)) 
            { 
                return true; 
            } 
    
            return false; 
        } 
    
        void Run() 
        { 
            // better sleep 
            timeBeginPeriod(1); 
    
            while (true) 
            { 
                for(size_t i = 0; i < buttons.size(); i++) 
                { 
                    Button &b = buttons[i]; 
    
                    COLORREF targetColor = GetColor(b.pos, 2, 1); 
    
                    bool isSimilar = IsColorSimilar(targetColor, b.color, 30); 
    
                    if (isSimilar && !b.down/* && (b.locktime + 90) < timeGetTime() */) 
                    { 
                        keybd_event(b.key, 0, 0, 0); 
                        // press enter at the same time 
                        //keybd_event(0xD, 0, 0, 0); 
                        b.down = true; 
                        b.locktime = timeGetTime(); 
                    } 
                    else if(!isSimilar && b.down && /*(b.locktime + 50) < timeGetTime() && */!HasToHold(b)) 
                    { 
                        //keybd_event(0xD, 0, KEYEVENTF_KEYUP, 0); 
                        keybd_event(b.key, 0, KEYEVENTF_KEYUP, 0);                    
                        b.down = false; 
                    } 
                } 
              sleep (10);
    
            } 
        } 
    
        int Clamp(int val, int min, int max)
    

Anmelden zum Antworten