Originally Posted by Valia
Hallo zusammen,
Ich möchte hier mal einige Sachen public machen, die ich damals sowohl serverseitig, als auch clientseitig am Server "BlackRose" gemacht habe.
Ich sage gleich vorab: Wer sich anstrengt, hätte diese Sachen auch alleine machen können.
~Serverfiles~
Komplett entbuggte 2010 Serverfiles habe ich selbstverständlich da. Die Configs wurden so weit angepasst, sodass die Einstellung wie die Range nicht mehr verkehrt sind. Auch die Game ist bugfrei (vielen Dank an Kriege*Zahlen vergessen*), inklusive den neuesten Fixes.
Die Maps wurden gleichmäßig auf beide games verteilt.
Downloadlink: Nur per PN.
~Musikpack~
-> Nein, kein Techno! Ich habe eine Weile lang mich drangesetzt und einige neue Musikstücke zusammengesucht, die den Clienten etwas verbessern. Bei meinen Spielern haben diese Musiktitel gleich eine viel bessere Atmosphäre geschaffen - es gab jedenfalls keine Kritik dafür und ich persönlich finde auch, dass sie relativ zu den Themen passen.
Downloadlink: Da ich mir nicht sicher bin - auch nur per PN.
~Skills wie in BlackRose~
Ich habe mir die Freiheit genommen, bei meinem Server den Flammenschlag mit einem Skill zu ersetzen. Im Grunde ist er noch derselbe, er hat nur eine anderen Animation, die meines erachtens nach viel zu gut aussieht, als dass man sie fallen lassen sollte. Demnach wurden auch die 6. Skills mit übernommen, die Namen erhalten haben und deren DMG auch entbuggt ist. Angriff+ wurde auch ersetzt, durch einen Skill, der Reflektiert und die Movespeed erhöht, statt den Angriffswert wie vorher so minimal zu erhöhen.
Downloadlink: Da ich mir da auch nicht sicher bin - nur per PN.
~Neue Quests~
Auch sind bei BlackRose neue Quests vorhanden. Diese möchte ich auch nicht vorenthalten:
Starterset, welches nicht nur Krieger, sondern auch andere Rassen abfrägt.
Code:
quest give_basic_weapon begin
state start begin
when login begin
if pc.getqf("Neu2") != 1 then
else
set_state(__COMPLETE__)
return
end
if pc.getqf("basic_weapon") != 0 then -- old version support
return
end
local item_vnum2 = 11209
local item_vnum = 19
local item_vnum3 = 12209
if pc.job == 2 then
item_vnum2 = 11609
item_vnum3 = 12489
elseif pc.job == 3 then -- shaman
item_vnum = 7009
item_vnum2 = 11809
item_vnum3 = 12629
elseif pc.job == 1 then -- assassin
item_vnum = 1009
item_vnum2 = 11409
item_vnum3 = 12349
end
local item_count = pc.countitem(item_vnum)
local equip_weapon = pc.weapon
if item_count == 0 and equip_weapon != item_vnum then
pc.give_item2(item_vnum) -- jobtype weapon
pc.give_item2(item_vnum2) -- jobtype armor
pc.give_item2(item_vnum3) -- jobtype helmet
pc.give_item2(27003, 200) -- red potions
pc.give_item2(27006, 200)
pc.give_item2(72702)
pc.give_item2(71050, 200)
pc.give_item2(70038, 200)
pc.give_item2(13009)
pc.give_item2(14009)
pc.give_item2(15009)
pc.give_item2(16009)
pc.give_item2(17009)
pc.give_item2(71015)
pc.give_item2(71016)
pc.give_item2(71017)
horse.advance()
horse.advance()
horse.advance()
horse.advance()
horse.advance()
horse.advance()
horse.advance()
horse.advance()
horse.advance()
horse.advance()
horse.advance()
pc.give_item2(50052)
chat("Willkommen bei BlackRose!")
pc.setqf("Neu2", 1)
set_state(__COMPLETE__)
-- else
-- test_chat(string.format("job[%d],item_vnum[%d].count = %d, equip_weapon[%d]",
-- pc.job, item_vnum, item_count, equip_weapon))
end
end
end
state __COMPLETE__ begin
end
end
Map_warp (ursprünglich von jemand anderes geschrieben) mit verkürztem Dialog und vielen Auswahlmöglichkeiten
Code:
-- Teleporter
quest map_warp begin
state start begin
when 9012.chat."Möchtest du reisen?" begin
say_title ( "Teleporter:" )
say ( "Möchtest du teleportiert werden?" )
local main_set = select ( "Ja" , "Nein" )
if main_set == 2 then
return
end
local map = pc . get_map_index ( )
local empire = pc . get_empire ( )
local level = pc . get_level ( )
local cost = 1
say_title ( "Teleporter:" )
say ( "Wohin möchtest du teleportiert werden?" )
say_reward ( string . format ( "Das kostet dich %d Yang." , cost ) )
if map == 1 or map == 3 or map == 21 or map == 23 or map == 41 or map == 43 then
local guild_map_names = {
"Gildenzone" ,
"Gildenzone" ,
"Gildenzone" ,
}
guild_map_name = guild_map_names [ empire ]
local empire_castle = {
"Burgschlacht" ,
"Burgschlacht" ,
"Burgschlacht" ,
}
empire_castle = empire_castle [ empire ]
local sub_set = 0
if level < 10 then
sub_set = select ( guild_map_name , "Tal von Seungryong" , "Yongbi-Wüste" , "Berg Sohan" , empire_castle , "Andere Gebiete" )
if sub_set == 6 then
return
end
else
sub_set = select ( guild_map_name , "Tal von Seungryong" , "Yongbi-Wüste" , "Berg Sohan" , empire_castle , "Andere Gebiete" )
if sub_set == 6 then
say_title ( "Teleporter:" )
say ( "Wohin möchtest du teleportiert werden?" )
say_reward ( string . format ( "Das kostet dich %d Yang." , cost ) )
sub_set = select ( "Doyyumhwaji" , "Dämonenturm" , "Spinnendungeon" , "Lungsam" , "Roter Wald" , "Land der Riesen" , "Zurück" , "Abbrechen" ) + 5
if sub_set == 13 then
return
end
if sub_set == 12 then
say_title ( "Teleporter:" )
say ( "Wohin möchtest du teleportiert werden?" )
say_reward ( string . format ( "Das kostet dich %d Yang." , cost ) )
sub_set = select ( guild_map_name , "Tal von Seungryong" , "Yongbi-Wüste" , "Berg Sohan" , empire_castle , "Andere Gebiete" )
if sub_set == 6 then
say_title ( "Teleporter:" )
say ( "Wohin möchtest du teleportiert werden?" )
say_reward ( string . format ( "Das kostet dich %d Yang." , cost ) )
sub_set = select ( "Doyyumhwaji" , "Dämonenturm" , "Spinnendungeon" , "Lungsam" , "Roter Wald" , "Land der Riesen" , "Abbrechen" ) + 5
if sub_set == 12 then
return
end
end
end
end
end
local warp = {
{
{ 128500 , 1000 } ,
{ 179500 , 1000 } ,
{ 271800 , 13000 } ,
} ,
{
{ 402100 , 673900 } ,
{ 270400 , 739900 } ,
{ 321300 , 808000 } ,
} ,
{
{ 217800 , 627200 } ,
{ 221900 , 502700 } ,
{ 344000 , 502500 } ,
} ,
{
{ 434200 , 290600 } ,
{ 375200 , 174900 } ,
{ 491800 , 173600 } ,
} ,
{
{ 975200 , 133000 } ,
{ 977200 , 185000 } ,
{ 923900 , 183600 } ,
} ,
{
{ 599400 , 756300 } ,
{ 597800 , 622200 } ,
{ 730700 , 689800 } ,
} ,
{
{ 590500 , 110500 } ,
{ 590500 , 110500 } ,
{ 590500 , 110500 } ,
} ,
{
{ 60000 , 496000 } ,
{ 60000 , 496000 } ,
{ 60000 , 496000 } ,
} ,
{
{ 288700 , 5700 } ,
{ 288700 , 5700 } ,
{ 288700 , 5700 } ,
} ,
{
{ 1.1199e+06 , 70800 } ,
{ 1.1199e+06 , 70800 } ,
{ 1.1199e+06 , 70800 } ,
} ,
{
{ 845100 , 745900 } ,
{ 845100 , 745900 } ,
{ 845100 , 745900 } ,
} ,
}
test_chat ( warp [ sub_set ] [ empire ] [ 1 ] .. warp [ sub_set ] [ empire ] [ 2 ] )
say_title ( "Teleporter:" )
say ( "Achtung, ich teleportiere dich jetzt. ")
wait ( )
pc . warp ( warp [ sub_set ] [ empire ] [ 1 ] , warp [ sub_set ] [ empire ] [ 2 ] )
else
local sub_set2 = 3
if empire == 1 then
sub_set2 = select ( "Yongan" , "Jayang" , locale . cancel )
elseif empire == 2 then
sub_set2 = select ( "Joan" , "Bokjung" , locale . cancel )
elseif empire == 3 then
sub_set2 = select ( "Pyungmoo" , "Bakra" , locale . cancel )
end
if sub_set2 ~= 3 then
if pc . gold < cost then
say_title ( "Teleporter:" )
say ( "Ich würde dich auch umsonst teleportieren," )
say ( "aber ich habe eine große Familie. Um sie zu" )
say ( "ernähren, muss ich Geld verdienen." )
say_reward ( string . format ( "Es kostet %d Yang." , cost ) )
else
if sub_set2 == 1 then
say_title ( "Teleporter:" )
say ( "Ich teleportiere dich dorthin." )
wait ( )
if empire == 1 then
pc . warp ( 474300 , 954800 )
elseif empire == 2 then
pc . warp ( 63800 , 166400 )
elseif empire == 3 then
pc . warp ( 959900 , 269200 )
end
elseif sub_set2 == 2 then
say_title ( "Teleporter:" )
say ( "Ich teleportiere dich dorthin." )
wait ( )
if empire == 1 then
pc . warp ( 353100 , 882900 )
elseif empire == 2 then
pc . warp ( 145500 , 240000 )
elseif empire == 3 then
pc . warp ( 863900 , 246000 )
end
end
pc . changegold ( - cost )
end
end
end
end
end
end
Grottequest zum Drachen
Code:
quest grotte begin
state start begin
when 20092.chat."Seelengrotte" begin
say_title("Die Seelengrotte")
say("Die Seelengrotte ist ein sehr gefährlicher Ort.")
say("Dort lauern viele Gefahren!")
say("Möchtest du sie wirklich betreten?")
local s = select("Hinein!","Abbrechen")
if s == 1 then
say("Okay")
pc.warp(0,1203200)
else
setskin(NOWINDOW)
return
end
end
when 20092.chat."Zum Drachen" with pc.get_map_index() == 72 begin
say_title("Zum Drachen")
if game.get_event_flag("Drache") == 1 then
say("Du kannst derzeit nicht hinein!")
say("Ein anderer befindet sich dort!")
return
end
say("Hier geht es zum Drachen...")
say("Bitte bedenke, dass es gefährlich ist..")
say("Du hast für diesen Boss 120 Sekunden Zeit.")
wait()
say("Möchtest du teleportiert werden?")
local a = select("Weiter", "Abbrechen")
if a == 1 then
if game.get_event_flag("Drache") == 1 then
say("Du kannst derzeit nicht hinein!")
say("Ein anderer befindet sich dort!")
return
end
say("Nun gut, pass auf dich auf.")
pc.setqf("Drachenrun", 1)
game.set_event_flag("Drache", 1)
pc.warp(153600,1203200)
end
end
when logout with pc.getqf("Drachenrun") == 1 begin
game.set_event_flag("Drache", 2)
pc.setqf("Drachenrun", 0)
pc.setqf("Drachenrun_failed", 1)
end
when login with pc.getqf("Drachenrun_failed") == 1 begin
pc.setqf("Drachenrun_failed", 0)
pc.warp(0,13032)
end
end
end
Seelensteinquest -> stark verkürzter Dialog + nur 1 einziger Rangpunkt wird verwendet (auf Wunsch kann die Rangpunktenzahl auch wieder erhöht werden. Dazu einfach nach "local need_alignment = 1" suchen und dementsprechend ändern. Selbstverständlich sind Seelibugs gefixt und das auch in einer Sprache, in der man sich nicht für seinen Server schämen muss.
Code:
quest training_grandmaster_skill begin
state start begin
when 50513.use begin
say_title("Großmeister")
if pc.count_item(50513) == 0 then
say("Die magische Kraft ist verschwunden.")
return
end
if pc.get_skill_group() == 0 then
say("Du hast keine Fertigkeiten "..pc.get_skill_group())
return
end
local result = training_grandmaster_skill.BuildGrandMasterSkillList(pc.get_job(), pc.get_skill_group())
local vnum_list = result[1]
local name_list = result[2]
if table.getn(vnum_list) == 0 then
say("Du hast keine Fertigkeiten")
return
end
say("Fertigkeit Auswählen")
say("")
local menu_list = {}
table.foreach(name_list, function(i, name) table.insert(menu_list, name) end)
table.insert(menu_list, "Abbrechen")
local s=select_table(menu_list)
if table.getn(menu_list) == s then
return
end
local skill_name=name_list[s]
local skill_vnum=vnum_list[s]
local skill_level = pc.get_skill_level(skill_vnum)
local cur_alignment = pc.get_real_alignment()
local need_alignment = 1
test_chat("Momentaner Rang: "..cur_alignment)
test_chat("Benötigter Rang: "..need_alignment)
local title=string.format("%s auf Großmeister %d lesen", skill_name, skill_level-30+1)
if pc.count_item(50513) == 0 then
say("Die magische Kraft ist verschwunden.")
return
end
if cur_alignment<0 then
say_reward(string.format("Benötigter Rang: %d -> %d", need_alignment, need_alignment*2))
elseif cur_alignment<need_alignment then
say_reward(string.format("Benötigter Rang: %d", need_alignment))
else
say_reward(string.format("Benötigter Rang: %d", need_alignment))
end
say("")
local s=select("Lesen", "Abbrechen")
if s==2 then
return
end
if pc.count_item(50513) == 0 then
say("Die magische Kraft ist verschwunden.")
return
end
if need_alignment>0 then
if pc.learn_grand_master_skill(skill_vnum) then
pc.remove_item(50513, 1)
pc.change_alignment(-need_alignment)
say_title(string.format("%s -Erfolgreich", title))
if 40 == pc.get_skill_level(skill_vnum) then
say(string.format("%s Seelitest2.", skill_name))
else
say(string.format("Dein Seelenstein war Erfolgreich!", skill_name, skill_level-30+1+1))
end
say("")
say_reward("Erfolgreich!")
say_reward(string.format("Kosten an Rang: %d ", need_alignment))
say("")
else
pc.remove_item(50513, 1)
say_title(string.format("%s -Fehlgeschlagen", title))
say("Dein Seelenstein hat nicht geklappt.")
say("")
say_reward("Fehlgeschlagen!")
say("")
pc.change_alignment(-number(need_alignment/3, need_alignment/2))
end
end
end
function BuildGrandMasterSkillList(job, group)
GRAND_MASTER_SKILL_LEVEL = 30
PERFECT_MASTER_SKILL_LEVEL = 40
local skill_list = special.active_skill_list[job+1][group]
local ret_vnum_list = {}
local ret_name_list = {}
-- test_chat(string.format("job=%d, group=%d", job, group))
table.foreach(skill_list,
function(i, skill_vnum)
local skill_level = pc.get_skill_level(skill_vnum)
-- test_chat(string.format("[%d]=%d", skill_vnum, skill_level))
if skill_level >= GRAND_MASTER_SKILL_LEVEL and skill_level < PERFECT_MASTER_SKILL_LEVEL then
table.insert(ret_vnum_list, skill_vnum)
local name=locale.GM_SKILL_NAME_DICT[skill_vnum]
if name == nil then name=skill_vnum end
table.insert(ret_name_list, name)
end
end)
return {ret_vnum_list, ret_name_list}
--return {ret_vnum_list, ret_name_list}
end
end
Da ich auch "kurzzeitig" Technikerin bei einem anderen Server war, habe ich dort auch Quests geschrieben oder wohl eher umgeschrieben, da viele mit Dialogen ausgestattet waren, die man einfach keinem Server zumuten sollte.
Blutsteinquest
Code:
quest blutstein begin
state start begin
when 20095.chat."Blutsteine" begin
local delay = 86400
if pc.get_level() < 75 then
say("Du bist zu schwach, um dir einen Blutstein zu verdienen!")
say_reward("Komm wieder wenn du Level 75 erreicht hast!")
return
end
say("Hallo!")
say("Möchtest du dir einen Blutstein verdienen?")
say("Du kannst ihn bei mir kaufen.")
say("Aber! Nicht jeder kann ihn kaufen.")
say("Du musst zuerst eine Prüfung ablegen.")
say("Nur so kann ich sehen, dass du würdig bist.")
say("")
say_reward("Willst du die Prüfung beginnen?")
local s= select("Weiter","Abbrechen")
if s==1 then
say("Sehr gut!")
say("Als erstes brauche ich versteinerte Tränen!")
say("Diese kriegst du an verschiedenen Orten!")
say_reward("Suche die versteinerten Tränen!")
setstate(vertrnen)
else
return
end
end
end
state vertrnen begin
when letter begin
send_letter("Besorge die versteinerten Tränen!")
local tropfen = {
{ 1333, 785},
{ 900,730},
{ 656,716},
{ 543,821},
{ 460,771},
{ 379,685},
{ 480,623},
{ 428,468},
{ 327,359},
{ 224,539},
{ 175,727},
{ 145,900},
{ 59,1000},
{ 176,1150},
{ 438,1112},
{ 646,1015},
{ 790,1183},
{ 1027,1043},
{ 1326, 1028},
{ 1376,1198},
{ 1408,1369},
{ 899,1396},
{ 539, 1338},
{ 574, 361},
{ 846, 455},
{ 1154, 498},
{ 1222, 440},
{ 1425,500},
{ 1283,347},
{ 1472,95},
{ 1100,159},
{ 787, 1083},
{ 610,175},
{ 500, 278},
{ 390,125},
}
local r = number(1,30)
target.pos("p1", tropfen[r][1], tropfen[r][2], 62, "")
local r = r+1
target.pos("p2", tropfen[r][1], tropfen[r][2], 62, "")
local r = r+1
target.pos("p3", tropfen[r][1], tropfen[r][2], 62, "")
local r = r+1
target.pos("p4", tropfen[r][1], tropfen[r][2], 62, "")
local r = r+1
target.pos("p5", tropfen[r][1], tropfen[r][2], 62, "")
local r = r+1
target.pos("p6", tropfen[r][1], tropfen[r][2], 62, "")
local r = r+1
target.pos("p7", tropfen[r][1], tropfen[r][2], 62, "")
local r = r+1
pc.setqf("tränen",7)
end
when button or info begin
say("Besorge noch 7 Versteinerte Tränen!")
say("Du findest sie an den sechs makierten Punkten auf der Karte")
end
when p1.target.arrive begin
target.delete("p1")
chat("Du hast eine Träne gefunden!")
pc.give_item2(30186,1)
pc.setqf("tränen",pc.getqf("tränen")-1)
if pc.getqf("tränen") == 0 then
say("Du hast alle 7 versteinerte Tränen gefunden!")
say("Gehe nun zu Seon Hae zurück")
setstate(rw)
end
end
when p2.target.arrive begin
target.delete("p2")
chat("Du hast eine Träne gefunden!")
pc.give_item2(30186,1)
pc.setqf("tränen",pc.getqf("tränen")-1)
if pc.getqf("tränen") == 0 then
say("Du hast alle 7 versteinerte Tränen gefunden!")
say("Gehe nun zu Seon Hae zurück")
setstate(rw)
end
end
when p3.target.arrive begin
target.delete("p3")
chat("Du hast eine Träne gefunden!")
pc.give_item2(30186,1)
pc.setqf("tränen",pc.getqf("tränen")-1)
if pc.getqf("tränen") == 0 then
say("Du hast alle 7 versteinerte Tränen gefunden!")
say("Gehe nun zu Seon Hae zurück")
setstate(rw)
end
end
when p4.target.arrive begin
target.delete("p4")
chat("Du hast eine Träne gefunden!")
pc.give_item2(30186,1)
pc.setqf("tränen",pc.getqf("tränen")-1)
if pc.getqf("tränen") == 0 then
say("Du hast alle 7 versteinerte Tränen gefunden!")
say("Gehe nun zu Seon Hae zurück")
setstate(rw)
end
end
when p5.target.arrive begin
target.delete("p5")
chat("Du hast eine Träne gefunden!")
pc.give_item2(30186,1)
pc.setqf("tränen",pc.getqf("tränen")-1)
if pc.getqf("tränen") == 0 then
say("Du hast alle 7 versteinerte Tränen gefunden!")
say("Gehe nun zu Seon Hae zurück")
setstate(rw)
end
end
when p6.target.arrive begin
target.delete("p6")
chat("Du hast eine Träne gefunden!")
pc.give_item2(30186,1)
pc.setqf("tränen",pc.getqf("tränen")-1)
if pc.getqf("tränen") == 0 then
say("Du hast alle 7 versteinerte Tränen gefunden!")
say("Gehe nun zu Seon Hae zurück")
setstate(vulkanglas)
end
end
when p7.target.arrive begin
target.delete("p7")
chat("Du hast eine Träne gefunden!")
pc.give_item2(30186,1)
pc.setqf("tränen",pc.getqf("tränen")-1)
if pc.getqf("tränen") == 0 then
say("Du hast alle 7 versteinerte Tränen gefunden!")
say("Gehe nun zu Seon Hae zurück")
end
end
when 20095.chat."Versteinerte Tränen" begin
if pc.getqf("tränen") != 0 then
say("Du hast noch nicht alle Tränen.")
say("Bitte finde sie zuerst!")
return
end
say("Sehr gute Arbeit")
say("Doch ich brauche noch mehr.")
say("Für einen Blutstein braucht es Vulkangläser.")
say("Bringe mir 4 von ihnen. Du erhälst sie von Flammen.")
setstate(vulkanglas)
end
end
state vulkangas begin
when letter begin
send_letter("Suche das Vulkanglas!")
end
when info or button begin
say("Besorge 4 Vulkangläser")
say("Diese erhälst du von Flammen")
end
when 2204.kill begin
local pct = number(1,20)
if pct==1 then
pc.give_item2(30188,1)
pc.setqf("gläser",pc.getqf("gläser")+1)
end
if pc.getqf("Gläser") == 4
chat("Du hast alle Gläser.")
setstate(rw)
end
end
end
state rw begin
when letter begin
send_letter("Zurück zu Seon Hae")
end
when button or info begin
say("Gehe zu Seon Hae zurück!")
end
when 20095.chat."Ich habe alles besorgt!" begin
say("Willkommen Zurück, Abenteurer..")
wait()
if pc.count_item(30186) >= 6 and pc.count_item(30188)>= 4 then
pc.remove_item(30186,6)
pc.remove_item(30188,4)
pc.give_item2(30189,1)
say("Sehr gut! Es stimmt alles!")
say("Hier hast du Tränen von Baljit-Elvedi")
say("Gehe nun in den roten Wald")
say("Und suche die geheimnisvolle Stimme!")
say("Sie wird dir die Tränen zu einem Blutstropfen machen!")
setstate(blut)
else
say("Du hast nicht alle benötigten Gegenstände!")
end
end
end
state blut begin
when letter begin
send_letter("Suche die Stimme")
träne = {
{ 195, 211},
{ 326, 302},
{ 527, 90},
{ 616, 257},
{ 702, 262},
{ 674, 38},
}
local r2 = number(1,6)
target.pos("träne", träne[r2][1], träne[r2][2], 68, "")
end
when info or button begin
say("Suche die geheimnisvolle Stimme im roten Wald!")
end
when träne.target.arrive begin
target.delete("träne")
say("Sei gegrüßt, Abenteurer...")
wait()
if pc.count_item(30189) >0 then
pc.remove_item(30189,1)
pc.give_item2(30187,1)
say("Ich mache die Tränen von Baljit-Elvedi zu einem Blutstropfen")
wait()
say("...")
wait()
say("Hier bitte, ein Blutstropfen!")
say_reward("Blutstropfen erhalten!")
setstate(stein)
else
say("Du hast die Träne nicht bei dir!")
say("Komm wieder wenn du sie gefunden hast...")
träne = {
{ 195, 211},
{ 326, 302},
{ 527, 90},
{ 616, 257},
{ 702, 262},
{ 674, 38},
}
local r2 = number(1,6)
target.pos("träne", träne[r2][1], träne[r2][2], 68, "")
end
end
end
state stein begin
when letter begin
send_letter("Zurück zu Seon Hae")
end
when button or info begin
say("Gehe zu Seon Hae zurück und gib ihm den Blutstropfen!")
end
when 20095.chat."Ich habe den Blutstropfen!" begin
if pc.count_item(30187) <= 0 then
say("Du besitzt den Blutstropfen nicht.")
else
pc.remove_item(30187,1)
say("Sehr gut gemacht!")
say("Ab sofort kannst du Blutsteine kaufen!")
say("")
say_reward("Dir ist es nun ermöglicht, Blutsteine zu kaufen.")
say_reward("Du hast einen Blutstein erhalten!")
pc.give_item2(30190,1)
clear_letter()
setstate(last)
end
end
end
state last begin
end
end
Auch die Icerun-Quest wurde umgeschrieben. So hat man dort nun auch bessere Dialoge... Einfügen müsst Ihr aber trotzdem machen^^
Code:
quest icerun begin
state start begin
when 20011.chat."Grotte des ewigen Eises" with pc.get_map_index() == [MAPINDEX] begin
say_title("Wächter der Grotte:")
say("Hallo Abenteurer,")
say("Ich kenne einen Ort, der sehr gefährlich ist..")
say("Man sagt, eine starke Magie würde dafür sorgen,")
say("dass dort ewiges Eis herrscht..")
say_reward("Es ist sehr gefährlich, darum müsst")
say_reward("Ihr mindestens zuzweit hier sein!")
say("")
say_title("Ihr seid "..game.get_event_flag("besuchinheiligerhalle").." Leute.")
say("")
say("Wollt Ihr in die Grotte gehen?")
say("")
local s = select("Weiter", "Abbrechen")
if s == 1 then
if game.get_event_flag("besuchinheiligerhalle")>=2 then
game.set_event_flag("besuchinheiligerhalle", game.get_event_flag("besuchinheiligerhalle")-1)
d.new_jump_all(199, 5106 , 4089)
d.regen_file("data/dungeon/icerun_regen.txt")
d.notice("Ihr hört ein lautes Grollen...")
d.notice("Anscheinend versperrt ein Metinstein den Weg.")
else
say_title("Wächter der Grotte:")
say("Ihr seid zu wenig...")
say("Ihr könnt so nicht weiter.")
say("")
say_reward("Ihr seid nur "..game.get_event_flag("besuchinheiligerhalle").." Leute.")
return
end
else
return
end
end
when [Vnum vom Wächter].chat."Zahl anpassen" with pc.is_gm() and pc.get_map_index() == [MAPINDEX] begin
say_title("Du kannst die Onlinezahl anpassen.")
say("Möchtest du sie um eins hoch oder runtersetzen?")
say("")
local s=select("Hoch setzen.","Runter setzen","Garnichts machen.")
if s==1 then
game.set_event_flag("besuchinheiligerhalle", game.get_event_flag("besuchinheiligerhalle")+1)
elseif s==2 then
game.set_event_flag("besuchinheiligerhalle", game.get_event_flag("besuchinheiligerhalle")-1)
else
return
end
end
when [Vnum vom Wächter].chat."Halle verlassen" with pc.get_map_index() == [MAPINDEX] begin
say_title("Wächter der Grotte:")
say("Ihr wollt diese Halle verlassen?")
say("")
local s = select("Verlassen", "Abbrechen")
if s == 1 then
local empire = pc.get_empire()
if empire == 1 then
pc.warp(474300,954800)
elseif empire == 2 then
pc.warp(63800,166400)
elseif empire == 3 then
pc.warp(959900,269200)
end
else
return
end
end
when logout begin
game.set_event_flag("besuchinheiligerhalle", game.get_event_flag("besuchinheiligerhalle")-1)
end
when login begin
game.set_event_flag("besuchinheiligerhalle", game.get_event_flag("besuchinheiligerhalle")+1)
pc.set_warp_location([MapIndex vom Treffort], 800, 800)
if pc.get_map_index() == 199 then
-- Nicht in einer Etage, die wieder nach drau¡¼n .
-- Layer Range
-- 1F 88 577 236 737
-- 2F 91 343 238 504
-- 3F 104 107 248 269
if pc.get_x() < 5000+90 or pc.get_y() < 4000+67 or pc.get_x() > 5000+135 or pc.get_y() > 4000+110 then
chat("...")
--pc.set_warp_location(199, 5000+105, 4000+89)
pc.warp((5000+106)*100, (4000+89)*100, 199)
return
end
chat("Euch ergreift eine starke Magie..")
chat("Plötzlich befindet Ihr euch woanders!")
pc.set_warp_location(199, 5000+105, 4000+89)
elseif pc.get_map_index() >= 2080000 and pc.get_map_index() < 2090000 then
pc.set_warp_location([MapIndex vom Treffort], 800, 800)
end
end
when 4012.kill with pc.get_map_index()>= 2080000 and pc.get_map_index() < 2090000 begin
timer("erster_metin", 6)
d.notice("Unter starkem Beben verschwindet der Metinstein.")
d.notice("Ihr habt den Zorn der Kreaturen auf euch gezogen!")
d.notice("Vernichtet sie alle!")
end
when erster_metin.timer begin
d.jump_all(5380 , 4122)
d.regen_file("data/dungeon/icerun1_regen.txt")
d.setf("keule", 0)
d.set_warp_at_eliminate(4, d.get_map_index(), (5000+432), (4000+122), "data/dungeon/icerun2_regen.txt")
pc.give_item2([ItemValue])
end
when [GrantelBart Value]chat."GM-Abkürzung BOSS" with pc.get_map_index() >= 2080000 and pc.get_map_index() < 2090000 and pc.is_gm() begin
say("Du kommst zum Bossraum")
wait()
npc.purge()
d.setf("statue", 5)
timer("ice_jump", 6)
end
when [GrantelBart Value]chat."Weiter in die Grotte" with pc.get_map_index() >= 2080000 and pc.get_map_index() < 2090000 begin
say("...")
wait()
say("Ich bin schon seit Jahrhunderten hier..")
say("Er.. Er hat mir das angetan..")
d.notice("Eine dunkle Magie macht sich breit..")
npc.purge()
d.kill_all()
timer("erster_spruch", 10)
end
when erster_spruch.timer begin
d.jump_all(5000+685, 4000+82)
d.setf("insel1", 0)
d.setf("insel2", 0)
d.setf("insel3", 0)
d.setf("insel4", 0)
d.setf("alleinseln", 0)
d.regen_file("data/dungeon/icerun3_1_regen.txt")
end
when [Nerolfrös Value]chat."GM-Abkürzung Mini-Bossraum" with pc.get_map_index() >= 2080000 and pc.get_map_index() < 2090000 and pc.is_gm() begin
say("Du kommst zum Mini-Bossraum")
wait()
npc.purge()
timer("inseln_fertigg", 10)
end
when [Nerolfrös Value]chat."Die 4 Inseln" with pc.get_map_index() >= 2080000 and pc.get_map_index() < 2090000 begin
say_title("Bewohner:")
say("Ich lebe hier schon seit Jahren...")
say("Nur wer alle Wege meistert, ist gewillt, ihn zu besiegen.")
say("Bitte! Befreit uns von ihm!")
local s=select ("Der Weg des Kriegers","Der Weg des Suras","Der Weg des Ninjas","Der Weg der Schamanen","Abbruch")
if s<=4 then
local positions = {
{685, 82},
{590, 82},
{590, 177},
{685, 177},
}
local fish = number(1,4)
if d.getf("insel"..fish) < 1 then
d.setf("insel"..fish, 1)
d.setf("alleinseln", d.getf("alleinseln")+1)
d.kill_all()
if d.getf("alleinseln")==4 then
d.notice("Bewohner:")
d.notice("Ihr wart überall.")
d.notice("Ich wünsche euch viel Glück!")
d.notice("Vernichtet unseren Meister!")
timer("inseln_fertig", 10)
return
end
d.notice("Bewohner:")
d.notice("Ihr seid bisher "..d.getf("alleinseln").." Wege gegangen.")
d.notice("Nur wer alle meistert, kann ihn besiegen.")
d.regen_file("data/dungeon/icerun3_"..fish.."_regen.txt")
else
d.kill_all()
d.regen_file("data/dungeon/icerun3_"..fish.."more_regen.txt")
d.set_warp_at_eliminate(4, d.get_map_index(), 5000 + positions[fish][1], 4000 + positions[fish][2], "data/dungeon/icerun3_"..fish.."_regen.txt")
end
d.jump_all(5000+positions[fish][1], 4000+positions[fish][2])
else
return
end
end
when 4001.kill with pc.is_gm() begin
chat("Dein Mapindex: "..pc.get_map_index())
end
when [ItemValue].use with pc.in_dungeon begin
pc.remove_item([ItemValue])
local empire = pc.get_empire()
if empire == 1 then
pc.warp(474300,954800)
elseif empire == 2 then
pc.warp(63800,166400)
elseif empire == 3 then
pc.warp(959900,269200)
end
end
when inseln_fertig.timer begin
timer("inseln_fertigg", 10)
d.notice("Die Magie wird immer stärker!")
d.notice("Er muss irgendwo in der Nähe sein!")
end
when inseln_fertigg.timer begin
local positionss = {
{473, 441},
{483, 451},
{473, 461},
{464, 451},
}
local fissh = number(1,4)
d.jump_all(5000+positionss[fissh][1], 4000+positionss[fissh][2])
d.regen_file("data/dungeon/icerun_small_boss.txt")
--d.jump_all(5000+122, 4000+89)
--d.exit_all()
end
when 4002.kill begin
d.notice("Besiegt den Gegner!")
d.regen_file("data/dungeon/icerun_statue.txt")
timer("miniboss", 10)
end
when miniboss.timer begin
d.setf("statue", 0)
d.setf("keulenmann", 0)
d.setf("keule", 1)
d.jump_all(5000+705, 4000+519)
end
when [Säulen Value].take with item.vnum == [Item für Säulen Value] begin
d.notice("Die Säule verschwindet...")
npc.purge()
item.remove()
d.setf("keulenmann", 0)
d.setf("statue", d.getf("statue")+1)
timer("ice_jump", 6)
if d.getf("statue")==5 then
d.notice("Alle Säulen wurden entfernt!")
d.setf("keule", 0)
end
end
when 4003.kill with d.getf("keule")==1 begin
d.setf("keulenmann", d.getf("keulenmann")+1)
if d.getf("keulenmann")== 9 then
game.drop_item("[Item für Säulen Value]")
end
end
when ice_jump.timer begin
local positionsss = {
{754, 494},
{705, 459},
{754, 424},
{705, 389},
{144, 449},
}
local fisssh = d.getf("statue")
d.jump_all(5000+positionsss[fisssh][1], 4000+positionsss[fisssh][2])
if fisssh==5 then
timer("ice_boss1", 20)
d.spawn_mob(2636, 124, 446)
d.spawn_mob(2635, 124, 450)
d.notice("Plötzlich erscheinen Kreaturen!")
d.notice("Vernichtet sie alle!")
else
d.regen_file("data/dungeon/icerun4_"..fisssh.."_regen.txt")
end
--d.jump_all(5000+122, 4000+89)
--d.exit_all()
end
when ice_boss1.timer begin
d.notice("Valons erscheinen... Ihr müsst sie bezwingen!")
for i = 1, 132 do
local firts= number(138, 231)
local secodn= number(413, 483)
d.spawn_mob(4004, firts, secodn)
end
d.setf("schild", 1)
d.setf("schildmann" , 0)
end
when 4004.kill with d.getf("schild")==1 begin
d.setf("schildmann", d.getf("schildmann")+1)
d.notice("Noch "..120-d.getf("schildmann").." Wächter müssen besiegt werden.")
if d.getf("schildmann")== 120 then
d.notice("Es erscheinen Kristallfelsen..")
d.notice("Ihr müsst sie aus dem Weg räumen.")
timer("ice_boss2", 15)
d.setf("schild", 0)
d.setf("kristallmann", 0)
end
end
when ice_boss2.timer begin
for i = 1, 220 do
local firts= number(138, 231)
local secodn= number(413, 483)
d.spawn_mob(4005, firts, secodn)
end
d.setf("kristall", 1)
end
when 4005.kill with d.getf("kristall")==1 begin
d.setf("kristallmann", d.getf("kristallmann")+1)
d.notice("Noch "..200-d.getf("kristallmann").." Kristalle zerschlagen.")
if d.getf("kristallmann")== 200 then
d.notice("Ihr habt große Arbeit geleistet!")
d.notice("Die dukle Magie scheint von dort zu kommen!")
timer("ice_boss3", 15)
d.setf("kristall", 0)
end
end
when ice_boss3.timer begin
d.purge()
d.spawn_mob(4006, 144, 449)
d.spawn_mob(4007, 124, 450)
d.setf("Nerala", 1)
end
when 4006.kill with d.getf("Nerala")==1 begin
d.notice("Als Ihr die Quelle der Magie bezwungen habt,")
d.notice("erscheint ein viel stärkerer Gegner.")
timer("ice_boss4", 15)
d.setf("Nerala", 0)
end
when ice_boss4.timer begin
d.purge()
d.spawn_mob(2625, 144, 449)
d.setf("Neralex", 1)
end
when 4007.kill with d.getf("Neralex")==1 begin
d.notice("Unter großem Beben und Donnern verwandelt er sich!")
timer("ice_boss5", 5)
d.setf("Neralex", 0)
end
when ice_boss5.timer begin
d.purge()
d.spawn_mob(4008, 144, 449)
d.setf("Neralexdragon", 1)
end
when 4008.kill with d.getf("Neralexdragon")==1 begin
for i= 1, 100 do
game.drop_item("1")
end
game.drop_item("90032")
d.notice("Die Magie scheint kurz verschwunden zu sein..")
d.notice("Doch irgendetwas stimmt hier nicht.")
timer("raus_hier", 30)
d.setf("Neralex", 0)
end
when raus_hier.timer begin
d.exit_all()
end
end
end
~clientzeugs, etc.~
Für einige Leute ist es immer noch schwer, in einer serverinfo.py mehr als nur einen Server auf 2010er Basis einzuteilen. Naja, hier ist sie:
Code:
import locale
def BuildServerList(orderList):
retMarkAddrDict = {}
retAuthAddrDict = {}
retRegion0 = {}
ridx = 1
for region, auth, mark, channels in orderList:
cidx = 1
channelDict = {}
for channel in channels:
key = ridx * 10 + cidx
channel['key'] = key
channelDict[cidx] = channel
cidx += 1
region['channel'] = channelDict
retRegion0[ridx] = region
retAuthAddrDict[ridx] = auth
retMarkAddrDict[ridx*10] = mark
ridx += 1
return retRegion0, retAuthAddrDict, retMarkAddrDict
if locale.IsEUROPE():
STATE_NONE = "..."
STATE_DICT = {
0 : "....",
1 : "NORM",
2 : "BUSY",
3 : "FULL"
}
SERVER01_CHANNEL = [
{"name":"Channel 1 ","ip":"serverip","tcp_port":13000,"udp_port":13000,"state":STATE_NONE,},
]
SERVER02_CHANNEL =[
{"name":"Channel 1 ","ip":"serverip2","tcp_port":13000,"udp_port":13000,"state":STATE_NONE,},
]
SERVER03_CHANNEL =[
{"name":"Channel 1 ","ip":"serverip3","tcp_port":13000,"udp_port":13000,"state":STATE_NONE,},
]
SERVER04_CHANNEL =[
{"name":"Channel 1 ","ip":"serverip4","tcp_port":13000,"udp_port":13000,"state":STATE_NONE,},
]
SERVER01_MARK = { "ip" : "serverip", "tcp_port" : 13000, "mark" : "10.tga", "symbol_path" : "10",}
SERVER02_MARK = { "ip" : "serverip2", "tcp_port" : 13000, "mark" : "20.tga", "symbol_path" : "20",}
SERVER03_MARK = { "ip" : "serverip3", "tcp_port" : 13000, "mark" : "30.tga", "symbol_path" : "30",}
SERVER04_MARK = { "ip" : "serverip4", "tcp_port" : 13000, "mark" : "40.tga", "symbol_path" : "40",}
SERVER01_AUTH = { "ip":"serverip", "port":11002, } #Server 1
SERVER02_AUTH = { "ip":"serverip2", "port":11002, } #Server 2
SERVER03_AUTH = { "ip":"serverip3", "port":11002, } #Server 3
SERVER04_AUTH = { "ip":"serverip4", "port":11002, } #Server 4
SERVER01 = { "name" : "Nous" }
SERVER02 = { "name" : "Bythos" }
SERVER03 = { "name" : "...." }
SERVER04 = { "name" : "...." }
TESTADDR = { "ip" : "210.123.10.153", "tcp_port" : 50000, "udp_port" : 50000, }
REGION0_ORDER_LIST = [
(SERVER01, SERVER01_AUTH, SERVER01_MARK, SERVER01_CHANNEL),
(SERVER02, SERVER02_AUTH, SERVER02_MARK, SERVER02_CHANNEL),
(SERVER03, SERVER03_AUTH, SERVER03_MARK, SERVER03_CHANNEL),
(SERVER04, SERVER04_AUTH, SERVER04_MARK, SERVER04_CHANNEL),
]
# BUILD
NEW_REGION0, NEW_REGION0_AUTH_SERVER_DICT, NEW_MARKADDR_DICT = BuildServerList(REGION0_ORDER_LIST)
# RESULT
NEW_REGION_NAME_DICT = {
0 : "GERMANY",
}
NEW_REGION_AUTH_SERVER_DICT = {
0 : NEW_REGION0_AUTH_SERVER_DICT,
}
NEW_REGION_DICT = {
0 : NEW_REGION0,
}
MARKADDR_DICT = NEW_MARKADDR_DICT
REGION_DICT = NEW_REGION_DICT
REGION_NAME_DICT = NEW_REGION_NAME_DICT
REGION_AUTH_SERVER_DICT = NEW_REGION_AUTH_SERVER_DICT
Wer sich die Ports anschaut, wird wissen, was er da eintragen muss. Bei der IP bitte nicht das Wort "ip" mit eurer Serverip ersetzen, sondern den Eintrag "serverip". Vergesst aber nicht, dass die IP immer noch in "" geschrieben werden muss.
Soo.. Mehr folgt natürlich noch, habe noch irgendwo eine Quest rumliegen und werde mal schauen, dass ich sie die Tage mal pub mache. Genau so wie noch einigen anderen Krams, der aber nicht mehr sooo wichtig ist..
Hoffe jedenfalls, dass es jemandem hilft. Keine Sorge, ich betreibe keinen Server mehr, also habe ich nicht vor, irgendwie Werbung mit den Downloadlinks zu machen, auch wenn die URL so aussieht.
Kommentare wie "kannte ich schon", "hatte ich schon", etc. könnt Ihr euch sparen. Es gibt sicher Leute, denen es hilft und genau dafür ist es da und nichts anderes. Wenn es Probleme gibt, bin ich jederzeit über PN zu erreichen.
lg,
Valia
|