Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[MegaTuT] Tworzenie bota UridiumWars


Sekhmet

Rekomendowane odpowiedzi

Opublikowano

[MegaTuT] Tworzenie bota UridiumWars

 

Celem tego poradnika jest wdrożenie użytkowników MPC w coś bardziej ambitnego niż odpalenie KBota i czekanie na urke. MPCForum ma zrzeszać programistów a tak naprawde jest ich garstka, dlatego postaram Wam wytłumaczyć jak takie boty działają oraz krok po kroku stworzymy bota do UridiumWars(mimo że w styczniu zniknie, wiedza Wam zostanie). Gotowi? Do dzieła!

 

 

 

octocat_social.png?69c58ee1

 

 

 

Spis treści

  1. Przygotowanie do pracy
  2. Podstawowy kod
  3. Klasa do obsługi serwera
  4. Alieny, gracze i my
  5. Skrzynki bonusowe
  6. Surowce
  7. Teleporty
  8. Skakanie przez porty
  9. Zaawansowane funkcje rysowania mapy
  10. Sniffowanie pakietów
  11. BotThread
  12. Mowa końcowa

Przygotowanie do pracy

 

Bota tworzymy w C#, więc standardowo tworzymy projekt w VisualStudio/SharpDevelop.

W designerze dodajemy kontrolki:

  • PictureBox(map) o rozmiarach 400x250, będziemy go używać do rysowania mapy. Warto zmienić tło na czarne.
  • Trzy TextBoxy(id, sid, mapid) - będziemy w nich podawać dane do logowania.
  • Button(zaloguj) w którego evencie będziemy startować logowanie.

1357040390-U288219.jpg

 

 

Przechodzimy do Form1.Designer.cs i w miejscu gdzie tworzony jest nasz picturebox dodajemy

this.map.Paint += new System.Windows.Forms.PaintEventHandler(this.map_Paint);

Co doda nam wywoływanie eventu Paint.

 

Tak powinien wyglądać teraz kod designera odpowiedzialny za kontrolkę map

 

 

//
// map
//
this.map.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.map.Location = new System.Drawing.Point(2, 3);
this.map.Name = "map";
this.map.Size = new System.Drawing.Size(400, 250);
this.map.TabIndex = 0;
this.map.TabStop = false;
this.map.Paint += new System.Windows.Forms.PaintEventHandler(this.map_Paint);

 

 

 

Oraz w kodzie Formy(Form1.cs i klikamy F7) dodajemy funkcję

private void map_Paint(object sender, EventArgs e)
{
// TODO: Rysowanie mapy
}

 

 

Jakby ktoś się interesował możemy dodawać eventy z poziomu okna Properties klikając na symbol błyskawicy

1357059161-U288219.jpg

 

 

Jeśli ktoś ma wątpliwości gdzie należy dodać tą funkcję(mam nadzieje że nie) dodaję w spoilerze cały kod Form1.cs

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MPCBot
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void map_Paint(object sender, EventArgs e)
{
// TODO: Rysowanie mapy
}
}
}

 

 

 

Teraz u góry dodamy sobie klasy których będziemy używać.

 

 

using System.Net;
using System.IO;
using System.IO.Compression;
using System.Threading;
using System.Net.Sockets;

 

 

I nad naszym eventem rysowania mapy dodamy 2 wątki - jeden do ogólnej obsługi bota, drugi do rysowania mapy.

public Thread paintThread;
public Thread botThread;

 

Podstawowy kod

W tym etapie dodamy sobie kod odpowiedzialny za chwytanie pakietów oraz logowanie.

 

Żeby nam łatwiej się było porozumieć podam nasz aktualny kod i wydzielę z nich jakieś szczególne elementy.

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.IO;
using System.IO.Compression;
using System.Threading;
using System.Net.Sockets;
/*
Dyrektywy using
*/



namespace MPCBot
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}



public Thread paintThread;
public Thread botThread;

public string idStr;
public string sidStr;
public int mapidStr;
/*
Wnętrze klasy Form1 - tutaj dodajemy metody i zmienne(zmienne warto dodawać na samej górze.
*/

private void map_Paint(object sender, EventArgs e)
{
// TODO: Rysowanie mapy
}
}
}

 

 

 

Teraz dodamy sobie 2 zmienne typu string(łańcuch znaków) id, sid oraz int - mapidStr

 

public string idStr;
public string sidStr;
public int mapidStr;

 

 

Teraz dodamy jeszcze zmienne do obsługi socketu i I/O postawionego na nim.

 

 

Socket socket;
int akcja;
string mapIP;
int port = 8080;
string version = "2.15";
Byte[] packet;
int _pos;
int _length;

 

 

I napiszemy funkcję wysyłającą pakiet

 

 

void sendPacket(string packet)
{
try
{
packet += "\n\0"; /* Każdy pakiet kończy się newline'em oraz end stringiem. */
Byte[] pakiet = Encoding.UTF8.GetBytes(packet); /* Pobieramy byte'y z stringu */
if (socket.Connected) /* Sprawdzamy czy socket jest połączony */
{
socket.Send(pakiet, packet.Length, SocketFlags.None); /* Wysyłamy pakiet */
}
}
catch (SocketException ex)
{
/* Coś poszło nie tak
* Możemy dodać debug log i drukować treść błędu z ex.ToString()
*/
}
}

 

 

Teraz dodamy funkcję którą wywołamy po kliknięciu buttona zaloguj, funkcję testującą akcję bota, oraz funkcję odświeżenia mapy.

 

 

public void Start()
{
botThread = new Thread(new ThreadStart(MainBotThread));
botThread.Start();
paintThread = new Thread(new ThreadStart(Redraw));
paintThread.Start();
}
public void MainBotThread()
{
if (akcja == 0)
{
/* Wywołanie logowania */
}
else if (akcja == 4)
{
/* Jesteśmy zalogowani */
}
}
delegate void __PictureBoxInvokeDelegate();
public void Redraw()
{
/* Nie możemy poprostu odświeżyć pictureboxa, ponieważ został utworzony w innym wątku */
map.Invoke(new __PictureBoxInvokeDelegate(Refresh));
}
public void Refresh()
{
map.Refresh();
}

 

 

Do tego funkcja Receive do otrzymywania pakietów

 

 

int Receive(out string PacketString)
{
/* Funkcja przyjmuje string jako argument i zwraca w nim pakiet.
* Jeśli funkcja wyjdzie z 0 - wszystko się powiodło
* Jeśli z 1 - coś poszło nie tak.
*
* Funkcja przyjmuje odbiera pakiet i przeksakuje po nim bajt po bajcie.
* Jeśli cały cykl się powiedzie otrzymujemy Pakiet poprzez argument PacketString
*/
int pl = -1;
int pp = 0;
bool cont = true;
Byte[] packet = new Byte[5000];
try
{
while (cont)
{
if (pos == _length)
{
pos = 0;
packet = new Byte[1000];
_length = socket.Receive(packet, 1000, SocketFlags.None);
}
if (_length == 0)
throw new SocketException(-1);
for (; pos < _length; pos++)
{
if (packet[pos] == 10)
{
pl = pp + 1;
packet[pp] = 13;
pos++;
cont = false;
break;
}
else if (packet[pos] == 0)
packet[pp] = 13;
else
packet[pp] = packet[pos];
pp++;
}
}
Byte[] OutPacket = new Byte[pl];
for (int i = 0; i < pl; i++)
OutPacket[i] = packet[i];
PacketString = Encoding.UTF8.GetString(OutPacket).Replace("\r\r\r", "");

}
catch (SocketException)
{
PacketString = "fail";
return 1; /* Coś poszło nie tak */
}
return 0; /* Wszystko się powiodło */
}

 

 

 

 

Teraz pozostaje dodać nam logowanie i możemy uznać rozdział za zakończony(dodałem 2 funkcje pomocnicze które wyciągną nam IP mapy).

 

 

 

/* IPMapy */
string pobierzIPMapy(int idMapy)
{
string szukany = string.Format("<map id=\"{0}\"", idMapy);
string koncowka = "</map>";
string kod;
try
{
kod = new WebClient().DownloadString("http://fb.darkorbit.bigpoint.com/src/swf/spacemap/xml/maps.php");
}
catch (Exception)
{
return "";
}
return pomiedzy(pomiedzy(kod, szukany, koncowka), "<gameserverIP>", "</gameserverIP>");
}
/* Pomiędzy */
string pomiedzy(string str1, string str2, string str3)
{
int pocz = str1.IndexOf(str2);
int konc = str1.IndexOf(str3, pocz);
return str1.Substring(pocz + str2.Length, konc - pocz - str2.Length);
}

void polaczenie()
{
akcja = 0;
while (true)
{
if (akcja == 0)
{
aktualneIP = pobierzIPMapy(mapidStr);
akcja = 1;
}
else if (akcja == 1)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
int tries = 0, maksTries = 100;
while (true)
{
try
{
socket.Connect(aktualneIP, port); /* Łączymy się z serwerem. */
}
catch (SocketException) { }
if (socket.Connected)
break;
else
{
tries++;
if (tries == maksTries)
{
MessageBox.Show("Nie udało się połączyć z serwerem");
return;
}
}
}
/* Pakiety logowania + blackbox */
sendPacket(string.Format("LOGIN|{0}|{1}|{2}", id, sid, version));
sendPacket("PNG");
sendPacket("LAB|UPD|GET");
sendPacket("RDY|MAP");
akcja = 2; /* Jesteśmy zalogowani skaczemy dalej */
}
else if (akcja == 2)
{
/* Łapiemy pakiety */
try
{
string p = "";
if (Receive(out p) != 0)
throw new SocketException(1);
PacketHandler(p);
}
catch (Exception)
{
}
}
}
}
void PacketHandler(string p)
{
/*
* TODO
*
*/
}

 

 

 

 

Klasa i obsługa serwera

Teraz napiszemy klasę która będzie zawierała wszystkie definicje pakietów, oraz metodę która będzie je parsowała.

 

Klasę dodajemy poprzez otworzenie menu klikając w nasz projekt PPM.

1357053597-U288219.jpg

 

Klasę nazwijmy Serwer.cs

 

Klasa będzie składała się z samych zmiennych o wartościach oznaczających pierwszy fragment pakietu

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MPCBot
{
class Serwer
{
public static string ERROR = "ERR";
public static string PING = "PNG";
public static string JUMP_FAILED = "k";
public static string INV = "ps|inv|name";
public static string NEW_MAP = "m";
public static string CREATE_STATION = "s";
public static string CREATE_PORTAL = "p";
public static string HERO_INIT = "I";
public static string CREATE_SHIP = "C";
public static string REMOVE_SHIP = "R";
public static string DESTROY_SHIP = "K";
public static string SHIP_MOVEMENT = "1";
public static string HERO_UPDATE_POSITION = "D";
public static string HITPOINTS_INFO = "HPT";
public static string SET_INFORMATION = "n";
public static string SET_PORTAL = "p";
public static string SET_PORTAL_REMOVE_ALL = "ALL";
public static string SET_PORTAL_REMOVE = "REM";
public static string SET_ATTRIBUTE = "A";
public static string VELOCITY_UPDATE = "v";
public static string CREATE_BOX = "c";
public static string REMOVE_BOX = "2";
public static int BOX_TYPE_NOT_FREE_CARGO_BOX = 0;
public static int BOX_TYPE_CARGO_BOX = 1;
public static int BOX_TYPE_BONUS_BOX = 2;
public static string CREATE_ORE = "r";
public static string REMOVE_ORE = "q";
public static string PORTAL_JUMP = "i";
public static string SET_ORE_COUNT = "E";
public static string SHIELD_INFO = "SHD";
public static string CREDITS_UPDATE = "C";
public static string LOG_MESSAGE = "LM";
public static string BOX_CONTENT_CREDITS = "CRE";
public static string BOX_CONTENT_URIDIUM = "URI";
public static string BOX_CONTENT_EXPERIENCE_POINTS = "EP";
public static string BOX_CONTENT_HONOR_POINTS = "HON";
public static string BOX_CONTENT_LEVEL_UP = "NL";
public static string BOX_CONTENT_LASER_BATTERIES = "BAT";
public static string BOX_CONTENT_ROCKETS = "ROK";
public static string BOX_CONTENT_HITPOINTS = "HTP";
public static string BOX_CONTENT_DEDUCTION_HITPOINTS = "DHP";
public static string BOX_CONTENT_EXTRA_ENERGY = "XEN";
public static string BOX_CONTENT_ORE = "CAR";
public static string LEVEL_UPDATE = "LUP";
public static string BOX_CONTENT_JACKPOT = "JPE";
public static string PRIMARY_WEAPON_INFO = "B";
public static string SECONDARY_WEAPON_INFO = "3";
public static string ROCKETLAUNCHER = "RL";
public static string SET_ROCKETLAUNCHER_ROCKETS = "R";
public static string SET_STATUS = "S";
public static string LASER_ATTACK = "a";
public static string ROCKET_ATTACK = "v";
public static string ORE_COLLECTED_BY_HERO = "e";
public static string EXTRAS_INFO = "ITM";
public static string BUY = "5";
public static string BUY_LASER = "b";
public static string BUY_ROCKET = "r";
public static string ATTACK_INFO = "Y";
public static string ATTACKED_SHIP_INFO = "H";
public static string SHIP_SELECTED = "N";
public static string TARGET_FADE_TO_GRAY = "LSH";
public static string TARGET_FADE_TO_GRAY_ABORT = "USH";
public static string LOCALIZED_SERVER_MSG = "STM";
public static string IN_NO_ATTACK_ZONE = "P";
public static string OUT_OF_RANGE = "O";
public static string TARGET_IN_RANGE = "X";
public static string SET_COOLDOWN = "CLD";
public static string ROCKET_COOLDOWN = "ROK";
public static string INSTASHIELD_COOLDOWN = "ISH";
public static string EMP_COOLDOWN = "EMP";
public static string LOGOUT = "l";
public static string GROUPSYSTEM_GROUP_INVITE = "inv";
public static string GROUPSYSTEM_GROUP_INVITE_SUB_ACKNOWLEDGE = "ack";
public static string GROUPSYSTEM_GROUP_INVITE_SUB_BY_ID = "new";
public static string GROUPSYSTEM_GROUP_INVITE_SUB_BY_NAME = "name";
public static string GROUPSYSTEM_BLOCK_INVITATIONS = "blk";
public static string GROUPSYSTEM_GROUP_EVENT_UPDATE = "upd";
public static string ENEMY_WARNING = "w";
public static string CMD = "CMD";
public static string ENEMY_INFO = "0|C|";
}
}

 

 

 

W tym momencie możemy zacząć pisać funkcję PacketHandler

 

 

void PacketHandler(string p)
{
Byte[] Bytes = Encoding.UTF8.GetBytes(p);
string[] args = p.Split('|'); /* Pakiet rozdzielamy co każdy | */
if (args.Length >= 2) /* Jeśli pakiet ma minimum 2 części */
{
if (args[1] == Serwer.CREATE_SHIP) /* Ustawiamy statek w pobliżu*/
{
/*
* TODO
*/
}
else if (args[1] == Serwer.CREATE_PORTAL)
{
/*
* TODO
*/
}
}
}

 

 

 

 

Mamy zalążek bota(w zasadzie jest to pełnoprawny framework na którym możemy zbudować co chcemy).

 

Alieny, gracze i my

 

W tej części dodamy logowanie i podstawę podstaw klasę gracza i innych statków

 

 

Zacznijmy od logowania.

Musimy dodać event Click do buttona(najprościej będzie po prostu kliknąć na niego 2 razy).

 

private void zaloguj_Click(object sender, EventArgs e)
{
/* Przypisanie zmiennych */
this.idStr = id.Text;
this.sidStr = sid.Text;
this.mapidStr = Convert.ToInt32(mapid.Text);
/* Start wątków */
Start();
}

 

 

Możemy teraz się zalogować(dla samego faktu logowania - nic się nie wydarzy) - ID mapy wyciągamy z źródła tej strony

Dodamy teraz klasę Hero oraz dodamy do niej dane o userze.

 

Tworzymy klasę Hero.cs

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MPCBot
{
class Hero
{
/* Movement data */
public double ruchX;
public double ruchY;
public double realX;
public double realY;
public string ID { get; set; }
public string Nick { get; set; }
public int ShipID { get; set; }
public int Predkosc { get; set; }
public int Oslona { get; set; }
public int MaksOslona { get; set; }
public int HP { get; set; }
public int MaksHP { get; set; }
public int Cargo { get; set; }
public int MaksCargo { get; set; }
public double PozycjaX { get; set; }
public double PozycjaY { get; set; }
public int Firma { get; set; }
public long Kredyty { get; set; }
public int Uridium { get; set; }
public float JackPot { get; set; }
public int DesX { get; set; }
public int DesY { get; set; }

/* Set movement data */
public void setMovement(double x, double y)
{
this.ruchX = x;
this.ruchY = y;
}
/* Set Hero data */
public void ustaw(string id, string nick, int shipid, int predkosc, int shd, int maxshd, int hp, int maxhp, int cargo, int maxcargo, int posX, int posY, int firma, long kredyty, int uridium)
{
ID = id;
Nick = nick;
ShipID = shipid;
Predkosc = predkosc;
Oslona = shd;
MaksOslona = maxshd;
HP = hp;
MaksHP = maxhp;
Cargo = cargo;
MaksCargo = maxcargo;
this.realX = posX;
this.realY = posY;
PozycjaX = posX;
PozycjaY = posY;
Firma = firma;
Kredyty = kredyty;
Uridium = uridium;
//JackPot = jackpot;
}
public double Sqr(double liczba)
{
return liczba * liczba;
}
}
}

 

 

 

Dodajmy u góry pod naszymi zmiennymi

Hero hero = new Hero();

Teraz zmodyfikujemy kod PacketHandlera żeby zapisywał dane z HERO_INIT do naszej klasy

 

void PacketHandler(string p)
{
Byte[] Bytes = Encoding.UTF8.GetBytes(p);
string[] args = p.Split('|'); /* Pakiet rozdzielamy co każdy | */
if (args.Length >= 2) /* Jeśli pakiet ma minimum 2 części */
{
if (args[1] == Serwer.CREATE_SHIP) /* Ustawiamy nasz statek */
{
/*
* TODO
*/
}
else if (args[1] == Serwer.CREATE_PORTAL)
{
/*
* TODO
*/
}
else if (args[1] == Serwer.HERO_INIT)
{
hero.ustaw(args[2], args[3], int.Parse(args[4]), int.Parse(args[5]), int.Parse(args[6]), int.Parse(args[7]), int.Parse(args[8]), int.Parse(args[9]), int.Parse(args[10]), int.Parse(args[11]), int.Parse(args[12]), int.Parse(args[13]), int.Parse(args[16]), long.Parse(args[24]), int.Parse(args[25]));
MessageBox.Show(hero.Cargo.ToString());
}
}
}

 

 

Teraz możemy pobierać dane o naszym statku poprzez klasę hero, np.

hero.Cargo

 

 

To tyle na dzisiaj.

Cały kod znajduje się na GitHubie(odnośnik u góry).

 

 

 

Ciąg dalszy nastąpi.

Opublikowano

Super, tylko wątpie że komuś będzie się chciało, skoro UW mają zamykać. Ale zawsze może się przydać do zwykłego DO (jak ktoś złamie pakiety)

Opublikowano

Bardzo dobry tut, widać, że się narobiłeś :)

Przydałoby się do UW, szkoda, że zaraz zamykają.

Ale można przecież wszystko przerobić i zrobić do innej gry.

Opublikowano

Sekhmet hipisie, przesiadasz się z linuxa i instalujesz VS 2k8?

Poza tym kod zerżnięty, nie uznałbym tego za poradnik.

Opublikowano

Sekhmet hipisie, przesiadasz się z linuxa i instalujesz VS 2k8?

Poza tym kod zerżnięty, nie uznałbym tego za poradnik.

Zerżnięty czy nie, podzielił się :P

 

ps: Masz coś do linuxa?

Opublikowano

Sekhmet hipisie, przesiadasz się z linuxa i instalujesz VS 2k8?

Poza tym kod zerżnięty, nie uznałbym tego za poradnik.

 

Hm, kod który został ujęty w tej części pisaliśmy razem, jeśli ja kodu nie ściągnąłem to wiadomo kto to zrobił.

 

Jeśli Cię to obchodzi projekt który razem pisaliśmy(a który Ty zerżnąłeś), poszedł na przód a ja nie musiałem sciągać kodu z UDO i szczycić się że stworzyłem bota.

 

Jak za każdym razem pod moim tutem robisz cyrki niczego nie udowadniając, dali Ci mentora na którego imo nie zasłużyleś, więc byś chociaż zachowywał się jak na mentora przystało.

 

Jak chcesz robić cyrki to zapraszam na PW, jeden crack boga z Ciebie nie czyni.

 

Opublikowano

 

 

Hm, kod który został ujęty w tej części pisaliśmy razem, jeśli ja kodu nie ściągnąłem to wiadomo kto to zrobił.

 

Jeśli Cię to obchodzi projekt który razem pisaliśmy(a który Ty zerżnąłeś), poszedł na przód a ja nie musiałem sciągać kodu z UDO i szczycić się że stworzyłem bota.

 

Jak za każdym razem pod moim tutem robisz cyrki niczego nie udowadniając, dali Ci mentora na którego imo nie zasłużyleś, więc byś chociaż zachowywał się jak na mentora przystało.

 

Jak chcesz robić cyrki to zapraszam na PW, jeden crack boga z Ciebie nie czyni.

Więc oskarżasz mnie o kopiowanie kodu tvirusxa? To wywracanie kota ogonem, bo to mówimy o pisaniu poradników z MOIM kodem.

Dziwisz się, a nawet piszesz, że nie wypada to mentorowi, ale jak człowiek ma się zachować, jeżeli każdy Twój tutorial posiada MÓJ kod?

Opublikowano

 

Więc oskarżasz mnie o kopiowanie kodu tvirusxa? To wywracanie kota ogonem, bo to mówimy o pisaniu poradników z MOIM kodem.

Dziwisz się, a nawet piszesz, że nie wypada to mentorowi, ale jak człowiek ma się zachować, jeżeli każdy Twój tutorial posiada MÓJ kod?

 

 

"Twój" kod? Nasz kod(gdzie Twoja część to kopia z UDO)

 

Jeżeli TVIRUS udostępnił kod, Ty go użyłeś pisząc bota, to ten kod nie jest Twój, przykro mi.

 

Kod który tu jest pochodzi z naszego wspólnego projektu - jest tak samo Twój jak mój.

 

 

Jeśli chcesz tak patrzeć kto pierwszy użył tego kodu był nim tvirus a Ty nazwałeś go że ten kod jest "TWÓJ".

 

 

 

Opublikowano

Dzięki sekhmed, akurat uczę się C#, trafiłeś w samo sedno moich oczekiwań. Możesz być pewny że twoje wypociny nie poszły na marne.

comment_aKm2b5jSiJgvkhmrlSzZ5Yc80OK7Mzta

Opublikowano

 

 

 

"Twój" kod? Nasz kod(gdzie Twoja część to kopia z UDO)

 

Jeżeli TVIRUS udostępnił kod, Ty go użyłeś pisząc bota, to ten kod nie jest Twój, przykro mi.

 

Kod który tu jest pochodzi z naszego wspólnego projektu - jest tak samo Twój jak mój.

 

 

Jeśli chcesz tak patrzeć kto pierwszy użył tego kodu był nim tvirus a Ty nazwałeś go że ten kod jest "TWÓJ".

Skoro moja część jest kopią, to ciekawi mnie Twój wkład, bo to ty nie znasz podstaw.

 

EOT.

Opublikowano

 

Skoro moja część jest kopią, to ciekawi mnie Twój wkład, bo to ty nie znasz podstaw.

 

EOT.

 

Nie doszukuj się swojej własności tam gdzie jej nie ma.

To że masz mnie za noskilla nie znaczy że musisz podszywać się pod kod FLOSS.

 

No to eot.

 

Tutorial skończę prawdopodobnie w weekend, wrzucę finalnego commita i wezmę się za coś innego.

Opublikowano

Kiedy dalsza część? Bo jak widzę to nie jest pełny poradnik.

Opublikowano
jeden crack boga z Ciebie nie czyni.

 

taki wielki to crack ze wystarczy 1 linijka kodu w host'cie i pbdo działa + nie trzeba żadnego gówna "qbot" sciagac xD

Chodź, zrobimy te jebane zdjęcie, CZIIIISS *.*

Opublikowano

UW już nie ma więc po co ten tut To zwyczajny Spam i nabijanie posta jest :ninja:

fighting0070.gif

2151571077.png

Sygna nr 2 i 3:

 

 

f51f61ce7c7db.jpg

1358683560-U261555.png

Sygnatura by SoiThe

 

 

 

Pomagam w działach "Problemy z grami" "Komputery" "BFP4F" "Tworzenie stron www"

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...