1.Spis Treści:
1.Wstęp oraz trochę słów o MySQL i silnikach TFS (theforgottenserver).
2.Niezbędne programy.
3.Edytowanie pliku config.
4.Instalacja + Konfiguracja XAMPPa
5.Sposób tworzenia bazy.
6.Importowanie bazy danych.
7.Zarządzanie bazą.
8.Problemy ,które mogą się pojawić podczas pracy.
9.Przydatne linki.
1. Wstęp ,oraz dlaczego MySQL i silnik TFS?
a) Witam ,w tym poradniku postaram się Wam przybliżyć sposób tworzenia bazy danych. Jest to dopiero mój 3 kontakt z bazą ,ale myśle ,że wszystko mi się uda fajnie wyjaśnić.
b)Dlaczego MySQL ,jest lepszy od XML? Przy małej liczbie graczy tego nie zauważymy ,ale gdy pojawi się więcej graczy na silnikach XML ,serwery strasznie zamulają komputer ,ponieważ wszystkie dane są zapisywane w folderze ze silnikiem. Przy małej liczbie graczy to nie stanowi problemu ,ale co gdy serwer ma wczytać kilka tysięcy kont? Na serwerach MySQL , dane players/accounts zapisywane są w bazie danych ,przez co nie zamulają komputera.
c) Dlaczego wybrać TFS? Jest to "najbezpieczniejszy" serwer ,posiada mało błędów ,oraz jest przeznaczony dla ludzi ,którzy mają ambicje od 0 stworzyć swój świat z własną mapką,skryptami itp.
Przedstawię wam w jaki sposób możemy stworzyć bazę do tego serwera ,oraz jak go włączyć. Będę opierał się na wersji 8.41 ,ale myśle ,że na nowszych oraz starszych też zadziała.
2. Niezbędne programy.
Aby to potem jakoś ogarnąć polecam stworzyć folder Baza Danych ,a w nim podfoldery: theforgottenserver,XAMPP,Dll's.
TFS Theforgottenserver
Pliki DLL (są niezbędne) Dll's
XAMPP 1.6.6 - XAMPP
Ściągamy potrzebne programy do odpowiednich folderów.
3.Edycja pliku config!
a) Jeśli już ściągneliśmy XAMPP'a ,TFS i pliki DLL możemy to wszystko rozpakowac (Dllki i TFS są zapakowane w rozszerzeniu .zip ,jeśli nie mamy programu do rozpakowywania .zip ,prosze ściągnąć.)
b) Całą zawartość folderu Dll's proszę wkleić do głównego folderu serwera.( Jeśli zapyta czy wkleić i zamienić ,proszę się zgodzić).
c) Teraz możemy przystąpić do edycji Config.
Kod :
-- The Forgotten Server Config
-- Account manager
accountManager = "yes" ---------- Czy ma być włączony AccManager?
namelockManager = "yes"
newPlayerChooseVoc = "no"
newPlayerSpawnPosX = 752 <--------------- Pozycja X AccManagera
newPlayerSpawnPosY = 742 <---------------- Pozycja Y AccManagera
newPlayerSpawnPosZ = 6 <------------------Pozycja Z AccManagera
newPlayerTownId = 1
newPlayerLevel = 1
newPlayerMagicLevel = 0
generateAccountNumber = "no"
-- Banishments
notationsToBan = 3
warningsToFinalBan = 4
warningsToDeletion = 5
banLength = 7 * 24 * 60 * 60
finalBanLength = 30 * 24 * 60 * 60
ipBanishmentLength = 1 * 24 * 60 * 60
broadcastBanishments = "yes"
killsToBan = 5 <-------------- Ilość fragów do bana.
maxViolationCommentSize = 200
autoBanishUnknownBytes = "no"
-- Battle
-- NOTE: loginProtectionPeriod is the famous Tibia anti-magebomb system.
-- deathLostPercent set to nil enables manual mode.
worldType = "non-pvp" <--------------- Typ serwera , możliwe są pvp,non-pvp,pvp-enforced
hotkeyAimbotEnabled = "yes"
protectionLevel = 1 <-------- Od którego lvla jest Pvp.
pvpTileIgnoreLevelAndVocationProtection = "yes"
killsToRedSkull = 3 <------- Ilość fragów do Rs'a
pzLocked = 60 * 1000
criticalHitChance = 7
criticalHitMultiplier = 1
displayCriticalHitNotify = "no"
removeWeaponAmmunition = "yes" <------ Czy amucicja się kończy?
removeWeaponCharges = "yes"
removeRuneCharges = "yes" <------- Czy runki się kończą?
timeToDecreaseFrags = 24 * 60 * 60 * 1000
whiteSkullTime = 15 * 60 * 1000
noDamageToSameLookfeet = "no"
experienceByKillingPlayers = "no" <----- Czy mamy dostawać Exp za zabitego gracza
showHealingDamage = "no"
fieldOwnershipDuration = 5 * 1000
stopAttackingAtExit = "no"
oldConditionAccuracy = "no"
loginProtectionPeriod = 10 * 1000
deathLostPercent = 10
stairhopDelay = 2 * 1000
-- Connection config
worldId = 0
ip = "127.0.0.1" <--------- Ip serwera.
loginPort = 7171 <--------- Port
gamePort = 7172
adminPort = 7171
statusPort = 7171
loginTries = 10
retryTimeout = 5 * 1000
loginTimeout = 60 * 1000
maxPlayers = "1000" <------------ Maxymalna ilość graczy
motd = "Welcome to the Theforgotten Server " <-------- Co ma się pojawić podczas wchodzenia na Account.
displayOnOrOffAtCharlist = "no"
onePlayerOnlinePerAccount = "yes"
allowClones = 0
serverName = "Forgotten"
loginMessage = "Welcome to the Theforgotten Server" <--------- Co ma się pojawić po zalogowaniu.
adminLogsEnabled = "no"
statusTimeout = 5 * 60 * 1000
replaceKickOnLogin = "yes"
forceSlowConnectionsToDisconnect = "no"
loginOnlyWithLoginServer = "no"
-- Database
-- NOTE: sqlFile is used only by sqlite database, and sqlKeepAlive by mysql database.
-- To disable sqlKeepAlive such as mysqlReadTimeout use 0 value.
sqlType = "sqlite' <------- TUTAJ PROSZĘ ZMIENIĆ NA mysql!
sqlHost = "localhost"
sqlPort = 3306
sqlUser = "root"
sqlPass = "hasło" <------- Tutaj podajemy hasło,prosze je zapamiętać!
sqlDatabase = "theforgottenserver"
sqlFile = "forgottenserver.s3db"
sqlKeepAlive = 0
mysqlReadTimeout = 10
passwordType = "plain"
-- Deathlist
deathListEnabled = "yes"
maxDeathRecords = 5
-- Guilds
ingameGuildManagement = "yes"
levelToFormGuild = 8
guildNameMinLength = 4
guildNameMaxLength = 20
-- Highscores
highscoreDisplayPlayers = 15
updateHighscoresAfterMinutes = 60
-- Houses
buyableAndSellableHouses = "yes"
houseNeedPremium = "yes"
bedsRequirePremium = "yes"
levelToBuyHouse = 1
housesPerAccount = 0
houseRentAsPrice = "no"
housePriceAsRent = "no"
housePriceEachSquare = 1000
houseRentPeriod = "never"
-- Item usage
timeBetweenActions = 200
timeBetweenExActions = 1000
-- Map
-- NOTE: storeTrash costs more memory, but will perform alot faster cleaning.
-- useHouseDataStorage usage may be found at README.
mapName = "nazwa mapki" <------- Nazwa Mapy
mapAuthor = "autor" <------- Autor Mapki
randomizeTiles = "yes"
useHouseDataStorage = "no"
storeTrash = "yes"
cleanProtectedZones = "yes"
-- Startup
-- NOTE: defaultPriority works only on Windows
defaultPriority = "high"
optimizeDatabaseAtStartup = "yes"
removePremiumOnInit = "yes"
abortOnSocketFailure = "yes"
-- Miscellaneous
-- NOTE: promptExceptionTracerErrorBox works only with precompiled support feature,
-- called "exception tracer" (__EXCEPTION_TRACER__ flag).
maxMessageBuffer = 4
kickIdlePlayerAfterMinutes = 15
allowChangeOutfit = "yes"
allowChangeColors = "yes"
allowChangeAddons = "yes"
disableOutfitsForPrivilegedPlayers = "no"
bankSystem = "yes"
saveGlobalStorage = "yes"
displaySkillLevelOnAdvance = "no"
spellNameInsteadOfWords = "no"
emoteSpells = "no"
expireReportsAfterReads = 1
promptExceptionTracerErrorBox = "yes"
storePlayerDirection = "no"
playerQueryDeepness = 2
-- Premium-related
freePremium = "no"
premiumForPromotion = "yes"
-- Blessings
blessingsOnlyPremium = "yes"
blessingReductionBase = 30
blessingReductionDecreament = 5
-- Rates
-- NOTE: experienceStages configuration is located in data/XML/stages.xml.
experienceStages = "no"
rateExperience = 5.0 <-------- Współczynnik EXP
rateSkill = 3.0 <-------- Współczynnik SKILL
rateMagic = 3.0 <-------- Współczynnik MAGIC
rateLoot = 8 <-------- Współczynnik LOOT
rateSpawn = 1 <-------- Współczynnik SPAWN
-- Stamina
-- NOTE: Stamina is stored in miliseconds, so seconds are multiplied by 1000.
-- rateStaminaHits multiplies every hit done a creature, which are later
-- multiplied by player attack speed.
-- rateStaminaGain is multiplying every second of logged out time, eg:
-- 60 * 1000 / 3 = 20 seconds, what gives 1 stamina minute for 3 being logged off.
-- rateStaminaThresholdGain is dividing in case the normal gain (that is
-- multiplied by rateStaminaGain, btw.) passed above threshold, eg:
-- 60 * 1000 / 3 = 20 / 4 = 5 seconds (3 * 4 = 12 minutes for 1 stamina minute).
-- staminaRatingLimit* is in minutes.
rateStaminaLoss = 1
rateStaminaGain = 1000 / 3
rateStaminaThresholdGain = 4
staminaRatingLimitTop = 41 * 60
staminaRatingLimitBottom = 14 * 60
rateStaminaAboveNormal = 1.5
rateStaminaUnderNormal = 0.5
staminaThresholdOnlyPremium = "yes"
-- Party
-- NOTE: experienceShareLevelDifference is float number.
-- experienceShareLevelDifference is highestLevel * value
experienceShareRadiusX = 30
experienceShareRadiusY = 30
experienceShareRadiusZ = 1
experienceShareLevelDifference = 2 / 3
extraPartyExperienceLimit = 20
extraPartyExperiencePercent = 5
-- Global save
-- NOTE: globalSaveHour means like 03:00, not that it will save every 3 hours,
-- if you want such a system please check out data/globalevents/globalevents.xml.
globalSaveEnabled = "no"
globalSaveHour = 8 <------- Co ile godzin ma być global save
shutdownAtGlobalSave = "yes"
cleanMapAtGlobalSave = "no"
-- Spawns
deSpawnRange = 2
deSpawnRadius = 50
-- Summons
maxPlayerSummons = 2
teleportAllSummons = "no"
teleportPlayerSummons = "no"
-- Status
ownerName = "" <------- Owner serwera
ownerEmail = "#otland.net" <------ E-mail właściciela
url = "http://otland.net/" <------ Strona właściciela
location = "Europe" <----- Lokacja właściciela.
displayGamemastersWithOnlineCommand = "no"
-- Logs
-- NOTE: This kind of logging does not work in GUI version.
-- For such, please compile the software with __GUI_LOGS__ flag.
displayPlayersLogging = "yes"
runeFile = ""
outLogName = ""
errorLogName = ""
truncateLogsOnStartup = "no"
Kod :
sqlType = "sqlite' <------- TUTAJ PROSZĘ ZMIENIĆ NA mysql!
sqlHost = "localhost"
sqlPort = 3306
sqlUser = "root"
sqlPass = "hasło" <------- Tutaj podajemy hasło!
a) Najpierw instalujemy XAMPP'a ,cały czas klikamy dalej aż dojdziemy do tego punktu.Zaznaczamy tak jak na obrazku i klikamy Install.

b) Po zainstalowaniu włączamy XAMPP'a i powinno nam się pokazać takie kwadratowe okienko. Obok Apache i MySQL klikamy start. Jeśli wszystko dobrze zrobiliście powinno wam się pokazać tak jak na obrazku.

c) Teraz otwieramy naszą przeglądarkę i wpisujemy http://localhost/ ,wybieramy język i powinno nam się ukazać coś takiego.

d) Teraz powinniśmy się zabezpieczyć,klikamy w bezpieczeństwo po lewej stronie.
Pokaże nam się stronka z tym co jest już bezpieczne ,oraz z tym co jeszcze nie jest.
Szukamy takiego napisu
Kod :
To fix the problems for mysql, phpmyadmin and the xampp directory simply use
=> http://localhost/security/xamppsecurity.php <= [allowed only for localhost]

Wypełniamy jak na obrazku ,teraz bezpieczeństwo powinno wyglądać tak .(ZAZNACZAM ,ŻE HASŁO MA BYĆ TAKIE JAKIE WPISYWALIŚMY W CONFIG W FOLDERZE Z SERWEREM!)

e) Mamy skonfigurowanego XAMPP'a.
5.Tworzymy bazę danych.
a) Musimy mieć Apache i MySQL na "running' ,otwieramy przeglądarke i wpisujemy http://localhost/ ,klikamy po lewej stronie php my admin.

b) Po zalogowaniu pojawi się nam coś takiego.

c) W polu utwórz nową baze danych wpisujemy theforgottenserver i klikamy utwórz
d) Jeśli pojawił się taki komunikat to znaczy ,że wszystko zrobiłeś dobrze,gratulacje!

6. Import bazy danych.
Można bazę zaimportować w taki sposób jak opisał Killavus w jednym z poradników , lub tak.
Wchodzimy do naszej bazy theforgottenserver na górze pojawi nam się taka tabelka.

klikamy import ->przeglądaj i szukamy folderu z serwerem,a w nim schema.mysql.Klikamy wykonaj.

Jeśli wszystko zrobiliśmy dobrze pojawi nam się komunikat.

Gratulacje! Baza została zrobiona ,teraz możesz odpalić silnik. Powinno wyglądać tak.

7.Zarządzanie bazą!
1.Edytowanie graczy.
a)Wchodzimy w zakładkę theforgottenserver ,szukamy players,przeglądaj. W ten sposób możemy edytować poszczególnych graczy.

b) Jak zmienić wszystkim temple position za pomocą jednej komendy?
Wchodzimy w baze theforgottenserver ,players. Na górze pojawi się nam kilka zakładek : przeglądaj,struktura,SQL itd.. Klikamy SQL i pojawi nam się takie coś.

Usuwamy cały ten tekst i wklejamy kod.
Kod :
UPDATE players SET posx = 793, posy = 1014, posz = 7;
Myśle ,że sami dojdziecie jak "przemieszczać" się po bazie.
8. Problemy przy tworzeniu bazy danych.
a) Taki błąd pojawi się gdy w pliku config nie podamy hasła do bazy danych!

Aby temu zaradzić otwieramy config ,szukamy kodu i zamieniamy hasło na takie jakie podawaliśmy przy konfiguracji XAMPP'a.
Kod :
sqlPass = "pass"
b) Ten błąd pojawia się gdy w folderze data->world zamienimy mapki ,ale nie zamienimy ich nazw w pliku config ,przez co serwer nie może ich przeczytać.

Naprawiamy to w ten sposób ,że szukamy kodu i zamieniamy na nazwe naszej mapki.otbm
Kod :
mapName = "by Midas"
Silnik serwera działa ,lecz po wpisaniu IP wyświetla się komunikat ,że serwer offline.
Najprawdopodobniej wpisujecie złe IP. Jeżeli serwer jest na twoim komputerze i z niego starasz się połączyć to wpisujesz ip 127.0.0.1 ,a jeżeli starasz się połączyć z zewnątrz ,wpisujesz adres ip zewnętrzny ,lub nazwe jak np no-ip.
UWAGA! Jeśli podczas tworzenia pojawi się jakiś problem ,opisz go tutaj ,a postaram się zaradzić i dodam go do poradnika
9. Przydatne linki!
Spis komend ,do bazy MySQL! Komendy MySQL
XAMPP XAMPP
TFS 8.41 Theforgottenserver
Dll's Dll's
Mamo znalazłem wirusa! Trojan.Win32.Delf.djh by Killavus
Myśle ,że poradnik komuś pomoże w tworzeniu bazy danych ,a na pewno początkującym. Pozdrawiam Midas!
(Zastrzegam sobie prawo do publikacji treści poradnika na innych forach ,bez podania autora!)
Zakładki