Forum o ots

Załorzyciel Mateusz Kornet (KiKi)

Forum Forum o ots Strona Główna -> Artykuły -> Krok po Kroku: Czyli tworzenie i udoskonalanie OTS
Napisz nowy temat  Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat 
Krok po Kroku: Czyli tworzenie i udoskonalanie OTS
PostWysłany: Sob 21:40, 18 Mar 2006
KiKi
Administrator

 
Dołączył: 18 Mar 2006
Posty: 70
Przeczytał: 0 tematów

Ostrzeżeń: 0/3
Skąd: Bydgoszcz





Witam. Wiem o tym, że istnieje temat jak stworzyć OTS, ale postanowiłem napisać poradnik
gdzie będzie opisanych więcej informacji. Jakich dowiecie się w swoim czasie

No więc powinniśmy zacząć od najważniejszej rzeczy... czyli śćiągnięciu OTS
Tutaj podaje link do YurOTS 0.9.4b:
Cytat:
[link widoczny dla zalogowanych]


Następnie rozpakowywujemy plik i zaczynamy od config.lua, którego otwieramy za pomocą notatnika.
Właściwości-----> Otwórz za pomocą------> Notatnik

Tutaj już wam pokażę co powinniście lub możecie uzupełnić Miejsca oznaczone gwiazdką oznaczają
ważniejsze informacje

Konfiguracja Config.lua
Cytat:
---------------------------- OTServ configuration ------------------------------

-- datadir
datadir = "data/"

-- sets what map to load
map = "data/world/test.otbm" <------ Ścieżka do mapy. Przy zmienieniu jej na mapę o nazwie ,,moja" wystarczy zmienić ,,test" na ,,moja".

-- OTBM for binary, SQL for SQL map, XML for OTX maps
mapkind = "OTBM" <------ To zostawiamy.

-- SQL for acc/player info from SQL, XML for acc/player info from XML
sourcedata = "XML" <------ To zostawiamy.

-- the message the player gets when he logs in
loginmsg = "Witam na SiwekOTS" <------ Napis, który pojawia się po zalogowaniu do gry na kanale Default.

-- the port otserv listens on *
port = "7171" <------ Port Servera. Najlepiej zostawić taki jaki jest.

-- name of our server
servername = "SiwekOTS" <------ Nazwa servera.

-- name of the owner of our server
ownername = "GM Misjonarz" <------ Posiadacz servera.

-- email of the owner of our server
owneremail = "" <------ E-mail posiadacza servera.

-- the url for more server info
url = "" <------ Strona servera. Nie jest konieczna

-- the location of the server
location = "Poland" <------ To raczej zostawiamy

-- the ip the server should redirect too *
ip = "86.63.99.152" <------ Nasze IP. Aby je sprawdzić wchodzimy na [link widoczny dla zalogowanych]

-- The messagebox you sometimes get before you choose characters *
motd = "Witamy na SiwekOTS " <------ Tekst, który pojawia się przed listą postaci.
motdnum="0"

-- use md5 passwords for accounts, yes/no
md5passwords = "no"

-- world type. options: pvp, no-pvp, pvp-enforced *
worldtype = "pvp" <------ Typ świata.

Krótki opis
,,PvP- Można się zabijać"
,,PvP-Enforced- Za zabicie gracza dostaje się doświadczenie"
,,No-PvP- Nie można się zabijać.

-- max number of players allowed *
maxplayers = "40" <------ Maksymalna ilość osób na serverze.

-- exhausted time in ms (1000 = 1sec) *
exhausted = 1000 <------ Jak szybko można strzelać z runek. Poniżej 1000 można strzelać z macro =P

-- exhaustion time for healing spells (1000 = 1sec)
exhaustedheal = 1000 <------ Jak szybko można się leczyć czarami spontaniczymi (exura, exura gran, exura vita)

-- how many ms to add if the player is already exhausted and tries to cast a spell (1000 = 1sec)
exhaustedadd = 300

-- how long does the player has to stay out of fight to get pz unlocked in ms (1000 = 1sec)
pzlocked = 10*1000

-- allow multiple logins of the same char
allowclones = 0 <------ Ile osób może grać 1 charem. Przydatne do PvP

-- vocation names
vocations = {"a sorcerer", "a druid", "a paladin", "a knight"} <------ Najlepiej zostawić
promoted_vocations = {"a master sorcerer", "an elder druid", "a royal paladin", "an elite knight"} <------ Też najlepiej zostawić


--- SQL part
sql_host = "localhost"
sql_user = "root"
sql_pass = ""
sql_db = "otserv"


--- SQL MAP part
sqlmap = "test_map"
map_host = "localhost"
map_user = "root"
map_pass = ""
map_db = ""

------------------------- YurOTS basic configuration ---------------------------

-- name of your world (seen on the character list when logging in)
worldname = "Siwek OTS" <------ Nazwa Servera

-- how often do server saves it's state (0 = off, 5 = 5min, 60 = hour)
autosave = 10 <------ Co jaki czas ma następować zapis servera.

-- do you want to enable cap system? (yes/no)
capsystem = "no" <------ Czy ma być cap system??

-- do you want players to learn spells before they can use them? (yes/no) *
learnspells = "no" <------ Czy trzeba uczyć się czarów??

-- do you want to give premium account to all players? (yes/no)
freepremmy = "no" <------ Czy gracze mają zaczynać z Premium Account

-- do you want premium players to wait in queue as others? (yes/no)
queuepremmy = "yes"

-- how much % of {exp, mana, skill, eq, bp} do you lose when dying
diepercent = {"7", "7", "7", "7", "100"} <------ Jakie są szanse na stratę doświadczenia, m lvl, skilli, eq lub backpacka

-- how many summons player can have
maxsummons = 2 <------ Maksymalna ilość summonów.

-- do you want to give summons for all vocations? (yes/no)
summonsallvoc = "no" <------ Czy wszystkie profesje mogą tworzyć summona (Knight biega z 2 ds'ami?Razz)

-- chance of losing a spear when shot (0 - none lost, 100000 - all lost)
spearlosechance = 50 <------ Po ilu uderzeniach spear ma ulec zniszczeniu

-- anti-afk - maximum idle time to kick player (1 = 1min)
kicktime = 15 <------ Po ilu minutach po nie oddawaniu oznak życia gracz ma zostać wyrzucony z gry

-- maximum number of items player can keep in his/her depot
maxdepotitems = 10000 <------ Maksymalna ilość itemów w depo

-- maximum number of items on a house tile (including those in containers)
maxhousetileitems = 20 <------ Maksymalna ilość itemów na jednej kratce domku

-- how much death entries are saved in players file (old are deleted)
maxdeathentries = 10

-- mana consumend by {snakebite, moonlight, volcanic, quagmire, tempest} rod
rodmana = {"2", "3", "5", "8", "13"} <------ Najlepiej to i 3 poniższe zostawić.

-- mana consumed by wand of {vortex, dragonbreath, plague, cosmic energy, inferno}
wandmana = {"2", "3", "5", "8", "13"} <------ Najlepiej to i 2 poniższe zostawić.

-- shooting range of {snakebite, moonlight, volcanic, quagmire, tempest} rod
rodrange = {"4", "3", "2", "1", "3"} <------ Najlepiej to i 1 poniższy zostawić.

-- shooting range of wand of {vortex, dragonbreath, plague, cosmic energy, inferno}
wandrange = {"4", "3", "2", "1", "3"} <------ Najlepiej to zostawić.

-- damage of burst arrows blast
-- default is from (1*lvl+5*mlvl)*0.24 to (1*lvl+5*mlvl)*0.55 <------ Obrażenia od burst arrow
burstarrowdmg = {"1.0", "5.0", "0.24", "0.55"} <------ Obrażenia od burst arrow

--------------------------- Multipliers and gains ------------------------------

-- experience multiplier (how much faster you got exp from monsters) *
expmul = 4 <------ Mnożnik expa.

-- experience multiplier for pvp-enforced (how much faster you got exp from players)
expmulpvp = 2 <------ Przy PvP-Enforced po zabiciu gracza dostajemy jego doświadczenie. Tutaj jest mnożnik tego doświadczenia

-- skill multipliers: 1 - rl tibia, 10 - ten times faster etc. {no-voc, sorcerer, druid, paladin, knight}
weaponmul = {"5", "5", "5", "5", "40"} <------ Jak szybko mają rosnąć skille: fist, sword, axe i club figting
distmul = {"1", "1", "1", "40", "1"} <------ Jak szyko ma rosnąć distance
shieldmul = {"5", "5", "5", "20", "30"} <------ Jak szybko ma rosnąć shielding
manamul = {"1", "3", "3", "2", "2"} <------ Jak szybko ma rosnąć magic level

-- how much points of life,mana,cap do you get when advancing {no-voc, sorcerer, druid, paladin, knight}
capgain = {"10", "10", "10", "20", "25"} <------ Ile co level dana profesja ma otrzymywać capa
managain = {"5", "30", "30", "15", "5"} <------ Ile co level dana profesja ma otrzymywać many
hpgain = {"5", "5", "5", "10", "15"} <------ Ile co level dana profesja ma otrzymywać życia

-- how much faster do you recovery life,mana after eating food (1 - rl tibia)
healthtickmul = 10 <------ O ile razy szybciej ma rosnąć życie niż w rl tibii
manatickmul = 10 <------ O ile razy szybciej ma rosnąć mana niż w rl tibii

-------------------------------- Skull system ----------------------------------

-- how many unjustified kills to get a red skull
redunjust = 3 <------ Po ilu zabiciach mamy otrzymać red skulla (tylko w PvP)

-- how many unjustified kills to get banned
banunjust = 6 <------ Po ilu zabiciach mamy otrzymać automatycznego bana

-- how long do you have white skull after attacking player (1 = 1min)
hittime = 1

-- how long do you have white skull after killing player (1 = 1min)
whitetime = 15 <------ Czas trwania white skulla

-- how long do you have red skull (1 = 1min)
redtime = 6*60 <------ Czas trwania red skulla. Im więcej osób tutaj zabijemy tym dłużej mamy. Po zabiciu 3 osób czekamy 3h, po 4 graczach 4h itd.

-- how long do you have to wait to lose 1 unjustified kill (1 = 1min)
fragtime = 12*60

------------------------------ GM access rights -------------------------------- To już zostawimy

-- access to walk into houses and open house doors
accesshouse = 3

-- access to login without waiting in the queue or when server is closed
accessenter = 3

-- access to ignore damage, exhaustion, cap limit and be ignored by monsters
accessprotect = 3

-- access to broadcast messages and talk in colors (#c blabla - in public channels)
accesstalk = 3

-- access to move distant items from/to distant locations
accessremote = 3

-- access to see id and position of the item you are looking at
accesslook = 3



Tak więc po uzupełnieniu tych ważnych i mniej ważnych pól mamy właściwie OTS gotowego.

Zmienianie cen run
Ale zapewne nie jeden z was chciał by, aby na serverze nie były takie drogie runy.
Jak to zrobić?? Właśnie tak:
Wchodzimy w folder z OTS następnie data/npc/scripts
Otwieramy plik runes.lua za pomocą notatnika i zmieniamy następujące rzeczy:
Cytat:
focus = 0
talk_start = 0
target = 0
following = false
attacking = false

function onThingMove(creature, thing, oldpos, oldstackpos)

end


function onCreatureAppear(creature)

end


function onCreatureDisappear(cid, pos)
if focus == cid then
selfSay('Good bye then.')
focus = 0
talk_start = 0
end
end


function onCreatureTurn(creature)

end


function msgcontains(txt, str)
return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end


function onCreatureSay(cid, type, msg)
msg = string.lower(msg)

if (msgcontains(msg, 'hi') and (focus == 0)) and getDistanceToCreature(cid) < 4 then
selfSay('Hello ' .. creatureGetName(cid) .. '! I sell runes, wands and rods.')
focus = cid
talk_start = os.clock()

elseif msgcontains(msg, 'hi') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then
selfSay('Sorry, ' .. creatureGetName(cid) .. '! I talk to you in a minute.')

elseif focus == cid then
talk_start = os.clock()

if msgcontains(msg, 'runes') then
selfSay('I sell hmms (40gps), uhs (40gps), gfbs (60gps), explosions (60gps), sds (90gps) and blank runes (5gps). To buy more runes say "10 uh" or "100 sd".')
elseif msgcontains(msg, 'wands') then
selfSay('I sell wand of inferno (15k), plague (5k), cosmic energy (10k), vortex (500gp) and dragonbreath (1k).')
elseif msgcontains(msg, 'rods') then
selfSay('I sell quagmire (10k), snakebite (500gp), tempest (15k), volcanic (5k) and moonlight rod (1k).')

elseif msgcontains(msg, 'inferno') then
buy(cid,2187,1,15000)
elseif msgcontains(msg, 'plague') then
buy(cid,2188,1,5000)
elseif msgcontains(msg, 'cosmic energy') then
buy(cid,2189,1,10000)
elseif msgcontains(msg, 'vortex') then
buy(cid,2190,1,500)
elseif msgcontains(msg, 'dragonbreath') then
buy(cid,2191,1,1000)

elseif msgcontains(msg, 'quagmire') then
buy(cid,2181,1,10000)
elseif msgcontains(msg, 'snakebite') then
buy(cid,2182,1,500)
elseif msgcontains(msg, 'tempest') then
buy(cid,2183,1,15000)
elseif msgcontains(msg, 'volcanic') then
buy(cid,2185,1,5000)
elseif msgcontains(msg, 'moonlight') then
buy(cid,2186,1,1000)

elseif msgcontains(msg, '100 hmm') then
buy(cid,2311,100,800)
elseif msgcontains(msg, '10 hmm') then
buy(cid,2311,10,80)
elseif msgcontains(msg, 'hmm') then
buy(cid,2311,5,40)

elseif msgcontains(msg, '100 uh') then
buy(cid,2273,100,4000)
elseif msgcontains(msg, '10 uh') then
buy(cid,2273,10,400)
elseif msgcontains(msg, 'uh') then
buy(cid,2273,1,40)

elseif msgcontains(msg, '100 gfb') then
buy(cid,2304,100,2000)
elseif msgcontains(msg, '10 gfb') then
buy(cid,2304,10,200)
elseif msgcontains(msg, 'gfb') then
buy(cid,2304,3,60)

elseif msgcontains(msg, '100 explosion') then
buy(cid,2313,100,2000)
elseif msgcontains(msg, '10 explosion') then
buy(cid,2313,10,200)
elseif msgcontains(msg, 'explosion') then
buy(cid,2313,3,60)

elseif msgcontains(msg, '100 sd') then
buy(cid,2268,100,9000)
elseif msgcontains(msg, '10 sd') then
buy(cid,2268,10,900)
elseif msgcontains(msg, 'sd') then
buy(cid,2268,1,90)

elseif msgcontains(msg, 'blank') then
buy(cid,2260,1,5)

elseif string.find(msg, '(%a*)bye(%a*)') and getDistanceToCreature(cid) < 4 then
selfSay('Good bye, ' .. creatureGetName(cid) .. '!')
focus = 0
talk_start = 0
end
end
end


function onCreatureChangeOutfit(creature)

end


function onThink()
if (os.clock() - talk_start) > 30 then
if focus > 0 then
selfSay('Next Please...')
end
focus = 0
end
if focus ~= 0 then
if getDistanceToCreature(focus) > 5 then
selfSay('Good bye then.')
focus = 0
end
end
end



Zrobię tutaj przykład z hmm.
Mamy oto takie 2 linijki:
Cytat:
elseif msgcontains(msg, 'hmm') then
buy(cid,2311,100,40)


Tekst, który gracz musi wypowiedzieć, aby kupić daną runę.
Ilość strzałów w zakupionej runie
Suma pieniędzy zakupu runy

Czyli teraz przykładowo gdybyśmy napisali do NPC:
>Hi
>hmm

Musieli byśmy zapłacić 40 gp, a otrzymali byśmy hmm o wartości 100 strzałów.
Tak zmieniamy przy każdej runie, a będzie wszystko ok

Pełna konfiguracja Account Makera
Pierw zaczynamy od ściągnięcia WebServa najlepiej 1.2. Można pobrać z tąd
>>>Click<<<
Instalujemy i odpalamy. Pierw trzeba skonfigurować go opiszę tutaj jak.

No więc pierwsze okienko. Tutaj najlepiej wszystko zostawmy i przejdźmy dalej.


2 okienko. Tutaj możemy ustawić czy chcemy sterować serverem ręcznie czy nie. Osobiście nie polecam Więc najlepiej idziemy dalej.


W tym oknie też dobrze jest wszystko zostawić. Więc znów idziemy dalej.


Tutaj także idziemy dalej, gdyż nie ma tutaj nic takiego do zmieniania


Tutaj użytkowników neostrady dobrze zaznaczyć Bazę MySQL i zaznaczyć MySQL Max.


Do acc makera nie będziemy potrzebowali servera FTP więc idziemy dalej.


Dla tych co posiadają no-ip powinni zaznaczyć tą opcje, a jeżeli nie to idziemy dalej i to już koniec


Następnie włączamy WebServer i w pasku mamy ikonkę z takim komputerkiem. Klikamy na nią PPM i wybieramy folder główny. Otwiera nam się folder httpd, gdzie musimy umieścić pliki z acc makera. Przy acc makerze z YurOTS jest plik index.php, config.php, newacc.php.

Opiszę tutaj jak skonfigurować config.php z acc makera przy YurOTS, ale wszystkie działają na podobnej zasadzie

Cytat:
<?
//---------------------------- OTS directories --------------------------------
$diraccount = 'C:\\Downloads\\OTS3\YurOTS_094b\\ots\\data\\accounts'; <----- Tutaj podajemy ścieżke do pliku account przy OTS. Zróbcie to na obecnym wzorze i pamiętajcie o 2 kreskac ,,\\"
$dirplayer = 'C:\\Downloads\\OTS3\YurOTS_094b\\ots\\data\\players'; <----- Tutaj to co powyżej tylko ścieżke do folderu players
$dirvip = 'C:\\Downloads\\OTS3\YurOTS_094b\\ots\\data\\vip'; <----- A tutaj do folderu vip


//----------------------------- All vocations ----------------------------------
$lvl = '20'; // initial level <---- Tutaj wpisujemy z jakim lvl ma zaczynać każda postać
$exp = '98800'; // initial exp (must be correct with level) <---- Tutaj podajemy ilość expa. Uwaga!! Musi być taka jaka jest potrzebna na dany lvl!!!
$cap = '300'; // initial capacity <---- Tutaj podajemy ile postać ma posiadać capa jak zaczyna. Nie potrzebne jeżeli mamy wyłączony system capacity.

// spawn place
$spawnx = '160'; <---- Współrzędna ,,x" gdzie mamy zacząć na mapie. Najlepiej temple.
$spawny = '54'; <---- Współrzędna ,,y" gdzie mamy zacząć na mapie.
$spawnz = '7'; <---- Współrzędna ,,z" gdzie mamy zacząć na mapie.

// temple
$templex = '160'; <---- Współrzędna ,,x" temple, w którym każdy gracz zaczyna po śmierci
$templey = '54'; <---- Współrzędna ,,y" temple.
$templez = '7'; <---- Współrzędna ,,z" temple.

// do not change!
if (!defined('MALE')) define('MALE', 1);
if (!defined('FEMALE')) define('FEMALE', 0);
if (!defined('SORC')) define('SORC', 1);
if (!defined('DRUID')) define('DRUID', 2);
if (!defined('PALADIN')) define('PALADIN', 3);
if (!defined('KNIGHT')) define('KNIGHT', 4);

//-------------------------------- Sorcerer ------------------------------------
// Looks
$look[SORC][MALE] = '9'; <---- Tutaj ustawiamy wygląd chłopaka (dobrze zostawić, ale można się pobawić. Jeżeli chcecie mogę wam opisać jak zrobić, żeby zacząć np. z wyglądem Hero,
$look[SORC][FEMALE] = '58'; <----- To co powyżej, tylko że wygląd dziewczyny

// HP, mana, magic level
$health[SORC] = '295'; <------ Ile sorc ma mieć życia jak zacznie gre
$mana[SORC] = '395'; <------ Ile sorc ma mieć many jak zacznie gre
$mlvl[SORC] = '45'; <------ Jaki sorc ma mieć magic level jak zacznie gre

// Skills: fist,club,sword,axe,dist,shld,fish
$skill[SORC] = array(10, 10, 10, 10, 10, 15, 10); <---- Skille z jakimi zaczyna sorc

// Eq: helm, amul, bp, armor, rght, left, legs, boot, ring, ammo
$equip[SORC] = array(2490, 2129, 1988, 2463, 2423, 2525, 2468, 2643, 2164, 0); <--- Ekwipunek z jakim zaczyna sorcerer

// Backpack:
$bp[SORC] = '<item id="2152" count="50"/><item id="2311" count="100"/>'; <----- Co ma mieć sorcer w backpacku po zaczęciu gry.


Tutaj wpisujmy ID itemu, który ma mieć sorcer w backpacku. W tym wypadku są tutaj platynki, a 2 item to hmm
Ilość rzeczy. Przykładowo tutaj gracz zaczyna z 50 platynkami i hmm o ilości 100 strzałów. Przy itemach np. crown armor count niema znaczenia więc zostawiamy np. 1

Oczywiście w tym przykładzie opisałem tylko sorca, ale dalej mamy jeszcze w kolejności druida, paladyna i knighta. U nich sytuacja wygląda tak samo tylko zmieniamy im np. eq, skille, hp, mane wedle uznania

Acc maker do rooka. Wklejamy po prostu pliki z folderu accmaker_rook i otwieramy config.php tak jak poprzednio notatnikiem.

Cytat:
<?
//---------------------------- OTS directories --------------------------------
$diraccount = 'c:\\YurOTS\\data\\accounts'; <---- Tak jak przy powyższym acc makerze podajemy ścieżke do folderu account
$dirplayer = 'c:\\YurOTS\\data\\players'; <---- Tutaj ścieżke do folderu players
$dirvip = 'c:\\YurOTS\\data\\vip'; <---- I tutaj do VIP


//-------------------------------- Rookie --------------------------------------
// spawn place
$spawnx = '85'; <---- Współrzędna ,,x" spawnu. Najlepiej temple na rooku.
$spawny = '211'; <---- Współrzędna ,,y" spawnu. Najlepiej temple na rooku.
$spawnz = '7'; <---- Współrzędna ,,z" spawnu. Najlepiej temple na rooku.

// temple
$templex = '85'; <---- Współrzędna ,,x" temple na rooku.
$templey = '211'; <---- Współrzędna ,,y" temple na rooku.
$templez = '7'; <---- Współrzędna ,,z" temple na rooku.

// Looks (male, female)
$look[1] = '130'; <----- Wygląd chłopaka.
$look[0] = '138'; <----- Wygląd dziewczyny.

// Eq: helm, amul, bp, armor, rght, left, legs, boot, ring, ammo
$equip = array( 0, 0, 1988, 2467, 0, 2382, 0, 0, 0, 0); <------ Początkowy ekwipunek.

// Backpack:
$bp = '<item id="2674" count="1"/>'; <------ Itemy w backpacku. W tym przypadku 1 jabłko.
?>


Ręczne tworzenie postaci
No więc tutaj opiszę ręczne tworzenie postaci. Co prawda nie jest potrzebne zabardzo kiedy posiadamy acc makera, ale warto wiedzieć na jakiej podstawie powstaje takie konto. W tym celu otwieramy notatnik i notujemy. Napiszę kawałek po kawałku, żeby wszystko opisać

Pierw wklejamy to.
Cytat:
<?xml version="1.0"?>


Teraz ustalamy jaki ma być dolny kod postaci.
Cytat:
<account pass="lolek"


Tutaj można ustawić ile ma się mieć dni pacc'a.
Cytat:
type="1" premDays="15">


Teraz doklejamy to najważniejsze. W miejscu ,,Azorea" wpisujemy nick postaci, która chcemy zrobić.
Cytat:
<characters>
<character name="Azorea"/>
</characters>


Jeżeli chcemy mieć 2 postacie na koncie doklejamy przed </characters> to i w miejscu ,,Misjonarz" Wpisujemy nick 2 postaci.
Cytat:
<character name="Misjonarz"/>


I dodajemy ostatnią linijkę, w której nic nie zmieniamy.
Cytat:
</account>


Całość powinna wyglądać wtedy tak:
Cytat:
<?xml version="1.0"?>
<account pass="lolek" type="1" premDays="15">
<characters>
<character name="Misjonarz" />
<character name="Azorea"/>
</characters>
</account>


Teraz należy to napisać w formacie *.xml
Załóżmy, że konto będzie miało nr. 159786
Więc wchodzimy w Plik>Zapisz jako... I postępujemy zgodnie z obrazkiem:

W miejscu ,,Nazwa pliku" wpisujemy przykładowo 159786.xml:!:
W ,,Zapisz jako typ" Tutaj musimy roziwnąć listę i wybrać ,,Wszystkie pliki"
I zapisujemy konto w folderze z OTS data>accounts

Pamiętaj przy nazwie o dopisaniu .xml!!!

Pierwszy krok mamy za sobą teraz trzeba stworzyć plik z postaćią
Więc otwieramy notatnik i piszemy:
Zaczynamy tak jak poprzednio od tej linijki:
Cytat:
<?xml version="1.0"?>


Teraz dopisujemy to i w miejscu z nickiem Azorea wpisujemy nick postaci, która podaliśmy w poprzednim pliku z kontem
Cytat:
<player name="Azorea"


Teraz dodajemy to i w miejscu 159786 wpisujemy górny kod czyli nazwę poprzedniego pliku.
Cytat:
account="159786"


Tutaj ustawiamy płeć postaci. 0 to kobieta, a natomiast 1 mężczyzna.
Cytat:
sex="0"


Dodajemy to.
Cytat:
lookdir="1"


Teraz wpisujemy exp jaki ma mieć stworzona przez nas postać.
Cytat:
exp="98800"


Tutaj ustalamy profesje postaci. 1- Sorcerer, 2- Druid, 3- Paladin i 4- Knight
Cytat:
voc="1"


Tu natomiasto podajemy lvl zgodny z podanym wcześniej doświadczeniem (exp) postaci.
Cytat:
level="20"


Tutaj ustawiamy kim ma być postać. 0- Zwykły gracz, 1- Tutor, 2-Counsoller (chyba ), 3- GameMaster
Cytat:
access="0"


Teraz ustawiamy ilość posiadanego capa przez postać.
Cytat:
cap="300"


Poziom magiczny postaci.
Cytat:
maglevel="45"


I dopisujemy to. Tutaj nic nie zmieniamy, ponieważ to po zalogowaniu samo się uzupełni, a dotyczy tego, kiedy ostatnio postać była zalogowana.
Cytat:
lastlogin="0">


Teraz ujmę to jako 1. Tutaj wpisujemy współrzędne spawnu, czyli gdzie ma się po zalogowaniu postać pojawić i temple, czyli miejsca gdzie postać odradza się po śmierci.
Cytat:
<spawn x="160" y="54" z="7"/>
<temple x="160" y="54" z="7"/>
<health now="295" max="295" food="0"/>
<mana now="395" max="395" spent="0"/>


Tutaj możemy ustawić wygląd postaci, jednak najlepiej jest to zostawić, ale przy potworach istnieją podobne linijki, każdą można zamienić i będziemy wyglądać inaczej To raczej dla trochę bardziej wtajemniczonych, ponieważ newbie mogą się w tym nie połapać, ale mogę później o tym napisać
Cytat:
<look type="9" head="20" body="30" legs="40" feet="50"/>


Teraz ustalamy skille postaci. 0- Fist Fighting, 1- Club Fighting, 2- Sword Fighting, 3- Axe Fighting, 4- Distance Figting, 5- Shielding, 6- Fishing.
Cytat:
<skills>
<skill skillid="0" level="10" tries="0"/>
<skill skillid="1" level="10" tries="0"/>
<skill skillid="2" level="10" tries="0"/>
<skill skillid="3" level="10" tries="0"/>
<skill skillid="4" level="10" tries="0"/>
<skill skillid="5" level="15" tries="0"/>
<skill skillid="6" level="10" tries="0"/>
</skills>


Teraz podajemy ID skrzynki w depo (tej szarej) pod 7.6 jest to ID 2490, a pod 7.5 najlepiej sprawdzić w Map Editorze.
Cytat:
<inventory><slot slotid="1"><item id="2490"/></slot>
</inventory>


Teraz podajemy ID szkrzynki depo (tej brązowej) Są tutaj podane pod 7.6 więc sprawdzić w Map Editorze
Cytat:
<depots><depot depotid="1"><item id="2590"><inside><item id="2594"/></inside></item></depot></depots>


I kończymy tymi 2 linijkami.
Cytat:
<storage/>
</player>


Poprawnie zrobiona całość powinna wyglądać tak:
Cytat:
<?xml version="1.0"?>
<player name="Azorea" account="159786" sex="1" lookdir="1" exp="98800" voc="1" level="20" access="0" cap="300" maglevel="45" lastlogin="0">
<spawn x="160" y="54" z="7"/>
<temple x="160" y="54" z="7"/>
<health now="295" max="295" food="0"/>
<mana now="395" max="395" spent="0"/>
<look type="9" head="20" body="30" legs="40" feet="50"/>
<skills>
<skill skillid="0" level="10" tries="0"/>
<skill skillid="1" level="10" tries="0"/>
<skill skillid="2" level="10" tries="0"/>
<skill skillid="3" level="10" tries="0"/>
<skill skillid="4" level="10" tries="0"/>
<skill skillid="5" level="15" tries="0"/>
<skill skillid="6" level="10" tries="0"/>
</skills>
<inventory><slot slotid="1"><item id="2490"/></slot>
</inventory>
<depots><depot depotid="1"><item id="2590"><inside><item id="2594"/></inside></item></depot></depots>
<storage/>
</player>


Tworzenie potworów

Wiem, że jest to bardzo prosta rzecz, ale nie każdy wie jak zrobić własnego potwora, a przynajmniej jak dodawać różne rzeczy. No więc zacznijmy. No więc zaczynamy od wejścia do folderu z OTS następnie data/monsters i otwieramy notatnik i norujemy w nim:

Jak zawsze na początek tą linijkę:
Cytat:
<?xml version="1.0"?>


Teraz należy dodać to i wpisujemy nazwę potworka np. ja dałem Wizard
Cytat:
<monster name="Wizard"


Teraz ustalamy level oraz magic level potwora. Wiemy oczywiście, że im wyższy lvl i m lvl to mocniej bije
Cytat:
level="50" maglevel="85"


Teraz ustawiamy ile przy expie 1x miałby mieć doświadczenia nasz potwór. Jak damy 10 to przy expie 3x będzie dawał nie 10, a 30
Cytat:
experience="8000"


Dodajemy to:
Cytat:
pushable="0"


Teraz ustawiamy jak dobrą ma mieć potwór zbroję oraz jak dobrą obronę.
Cytat:
armor="51" defense="62"


Teraz dodajmy to.
Cytat:
canpushitems="1" staticattack="50" changetarget="200"


I ustalamy szybkość potworka. Teraz akurat nie jest taki szybki
Cytat:
speed="325">


Teraz ustawiamy jak dużo potwór ma mieć życia oraz ile ma mieć maksymalnie
Cytat:
<health now="12000" max="12000"/>


Teraz ustalamy wygląd naszego potworka. Najlepiej skopiować tą linijkę od innego potwora, mój to akurat hero =]
Cytat:
<look type="73" head="20" body="30" legs="40" feet="50" corpse="3128"/>


Jeżeli to ma być potwór, który atakuje z dystansu to ustawiamy targetdistance na powyżej 1 (1- 1 kratka)
Cytat:
<combat targetdistance="1" runonhealth="0"/>


Teraz ustawiamy ataki. Dajmy mu przykładowo, aby atakował bronią i atakował nas z exori.
Cytat:
<attacks>
<attack type="melee" mindamage="150" maxdamage="270" probability="100" />
<attack type="instant" name="exori" exhaustion="500" cycleticks="5000" probability="70"/>
</attacks>


Teraz ustawmy na co miałby być odporny. Załóżmy, że będzie widział niewiedzialnych, nie zaatakujemy go trucizną oraz z energi np. hmm, exevo mort hur.
Cytat:
<defenses>
<defense immunity="invis"/>
<defense immunity="poison"/>
<defense immunity="energy"/>
</defenses>


Teraz ustawiamy co potwór ma wymawiać podczas gry Często przynosi to trochę zabawy jak potworek krzyczy ,,twoj kumpel jest noobem, twoja kumpela jest noobem i ty też jesteś noobem" ;p przykładowo Jeżeli chcemy, aby potworek nie krzyczał ciągle to samo to dodajemy drugą taką samą linijkę tylko zmieniamy tekst
<voices>
<voice sentence="twoj kumpel jest noobem, twoja kumpela jest noobem i ty też jesteś noobem!"/>
</voices>

Teraz chyba najważniejsze Ustawianie loota. Nie wiem co to są za itemy, ale to mniejsza z tym.

Więc jeżeli ustawić, aby przykładowo wypadało crown armor to należy dodać taką linijkę:
Cytat:
<item id="2491" chance="1899"/>
W miejscu z 2491 wpisujemy ID crown armor, a chance jak często ma wypadać.

Jak zrobić, żeby np. pięniądze wylatywały nie po 1 tylko po 2?? Otóż tak:
Cytat:
<item id="2148" countmax="10" chance1="100000" chancemax="0"/>

W miejscu item id jest już podany id gold coins, teraz w countmax ustawiamy ile maksymalnie może wypaść tych pieniędzy np. teraz maksymalnie wypadnie 10gp i przy chance tak jak wyżej jak często ma wypadać cash.

Teraz jak zrobić, żeby wypadał z potwora backpack albo bag, a w nim itemy?? Otóż tak.
Wpisujemy:
[quote]<inside>
<item id="2392" chance="1818"/> <-------- ID baga, może być backpack
<item id="2544" countmax="10" chance1="20000" chancemax="0"/> <--------- to co ma wypadać z niego, przykładowo strzały, maksymalnie 10.
</inside> <----------- To dodajemy

Tak wygląda już przykładowo gotowy loot.
Cytat:
<loot>
<item id="2491" chance="1899"/>
<item id="2487" chance="1009"/>
<item id="2148" countmax="100" chance1="100000" chancemax="0"/>
<inside>
<item id="2392" chance="1818"/>
<item id="2544" countmax="10" chance1="20000" chancemax="0"/>
</inside>
</item>
</loot>


Teraz wystarczy dodać to:
Cytat:
</monster>


I to wszystko

Na gotowy wzór pokaże już gotowego Hero. U nas powinno wyglądać wszystko tak samo tylko można pozmieniać to co powyżej
Cytat:
<?xml version="1.0"?>
<monster name="Hero" level="30" maglevel="50" experience="1200" pushable="0" armor="41" defense="42" canpushitems="1" staticattack="50" changetarget="200" speed="278">
<health now="1400" max="1400"/>
<look type="73" head="20" body="30" legs="40" feet="50" corpse="3128"/>
<combat targetdistance="1" runonhealth="0"/>

<attacks>
<attack type="melee" mindamage="100" maxdamage="250" probability="100" />
<attack type="distance" name="arrow" mindamage="52" maxdamage="130" cycleticks="3000" probability="100" />
</attacks>

<defenses>
<defense immunity="paralyze"/>
<defense immunity="invisible"/>
<defense immunity="fire"/>
<defense immunity="poison"/>
<defense immunity="energy"/>
</defenses>

<voices>
<voice sentence="Let's have a fight!"/>
<voice sentence="I will sing a tune at your grave."/>
<voice sentence="Have you seen princess Lumelia?"/>
<voice sentence="Welcome to my battleground!"/>
</voices>
<loot>
<item id="2491" chance="1899"/>
<item id="2487" chance="1009"/>
<item id="2148" countmax="100" chance1="100000" chancemax="0"/>
<item id="1949" chance="10009"/>
<item id="2456" chance="10090"/>
<item id="2661" chance="10000"/>
<item id="2681" chance="10000"/>
<item id="2121" chance="6666"/>
<item id="2666" countmax="3" chance1="20000" chancemax="0"/>

<item id="1987" chance="10000">
<inside>
<item id="2392" chance="1818"/>
<item id="2519" chance="1444"/>
<item id="2488" chance="1411"/>
<item id="2487" chance="1201"/>
<item id="2071" chance="10000"/>
<item id="2544" countmax="10" chance1="20000" chancemax="0"/>
<item id="2652" chance="10000"/>
<item id="2164" chance="1393"/>
<item id="2391" chance="1668"/>
<item id="2744" chance="6696"/>
</inside>
</item>
</loot>
</monster>


Teraz zapisujemy to jako format xml, chyba każdy wie jak, a jak nie to napiszcie to dorobię ,,Jak zrobić format xml"


Post został pochwalony 0 razy
Zobacz profil autora
Krok po Kroku: Czyli tworzenie i udoskonalanie OTS
Forum Forum o ots Strona Główna -> Artykuły
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Wszystkie czasy w strefie EET (Europa)  
Strona 1 z 1  

  
  
 Napisz nowy temat  Odpowiedz do tematu  


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001-2003 phpBB Group
Theme created by Vjacheslav Trushkin
Regulamin