Browse Source

Initial release of private airship system (#3354)

Fixes #3314 

Thanks to @aleos89 for his help.
Lemongrass3110 6 years ago
parent
commit
8dea04a8b3

+ 4 - 0
conf/battle/feature.conf

@@ -74,3 +74,7 @@ feature.homunculus_autofeed: off
 // Attendance System (Note 1)
 // Requires: 2018-03-07bRagexeRE or later
 feature.attendance: off
+
+// Private Airship System (Note 1)
+// Requires: 2018-03-21aRagexeRE or later
+feature.privateairship: off

+ 4 - 1
conf/msg_conf/map_msg.conf

@@ -852,7 +852,10 @@
 790: <MSG>3456,%d</MSG>
 791: You are not allowed to use the attendance system.
 
-//792-899 free
+// Private Airship
+792: The private airship system is disabled.
+
+//793-899 free
 
 //------------------------------------
 // More atcommands message

+ 2 - 0
db/re/item_db.txt

@@ -11523,6 +11523,8 @@
 25223,Para_Team_Coin,Eden Group Coin,3,0,,0,,,,,,,,,,,,,{},{},{}
 25238,New_Normal_Lubricant,New Normal Lubricant,3,0,,0,,,,,,,,,,,,,{},{},{}
 25239,New_Advanced_Lubricant,New Advanced Lubricant,3,0,,0,,,,,,,,,,,,,{},{},{}
+//
+25464,World_Moving_Rights,World Moving Rights,3,20,,0,,,,,,,,,,,,,{},{},{}
 //===================================================================
 // New Staves
 //===================================================================

+ 710 - 0
npc/re/mapflag/privateairship.txt

@@ -0,0 +1,710 @@
+//===== rAthena Script =======================================
+//= Mapflags:
+//= privateairship_source, privateairship_destination
+//===== Description: =========================================
+//= Private Airship available sources and destinations
+//===== Changelogs: ==========================================
+//= 1.0 First Version. [Lemongrass]
+//============================================================
+
+//=======================================
+// Available source maps
+//=======================================
+abbey01	mapflag	privateairship_source
+abbey02	mapflag	privateairship_source
+abbey03	mapflag	privateairship_source
+abyss_01	mapflag	privateairship_source
+abyss_02	mapflag	privateairship_source
+abyss_03	mapflag	privateairship_source
+alb2trea	mapflag	privateairship_source
+alberta	mapflag	privateairship_source
+alde_dun01	mapflag	privateairship_source
+alde_dun02	mapflag	privateairship_source
+alde_dun03	mapflag	privateairship_source
+alde_dun04	mapflag	privateairship_source
+alde_gld	mapflag	privateairship_source
+aldebaran	mapflag	privateairship_source
+ama_dun01	mapflag	privateairship_source
+ama_dun02	mapflag	privateairship_source
+ama_dun03	mapflag	privateairship_source
+ama_fild01	mapflag	privateairship_source
+amatsu	mapflag	privateairship_source
+anthell01	mapflag	privateairship_source
+anthell02	mapflag	privateairship_source
+aru_gld	mapflag	privateairship_source
+ayo_dun01	mapflag	privateairship_source
+ayo_dun02	mapflag	privateairship_source
+ayo_fild01	mapflag	privateairship_source
+ayothaya	mapflag	privateairship_source
+beach_dun	mapflag	privateairship_source
+beach_dun2	mapflag	privateairship_source
+beach_dun3	mapflag	privateairship_source
+bif_fild01	mapflag	privateairship_source
+bif_fild02	mapflag	privateairship_source
+bra_dun01	mapflag	privateairship_source
+bra_dun02	mapflag	privateairship_source
+bra_fild01	mapflag	privateairship_source
+brasilis	mapflag	privateairship_source
+c_tower1	mapflag	privateairship_source
+c_tower2	mapflag	privateairship_source
+c_tower3	mapflag	privateairship_source
+c_tower4	mapflag	privateairship_source
+cmd_fild01	mapflag	privateairship_source
+cmd_fild02	mapflag	privateairship_source
+cmd_fild03	mapflag	privateairship_source
+cmd_fild04	mapflag	privateairship_source
+cmd_fild06	mapflag	privateairship_source
+cmd_fild07	mapflag	privateairship_source
+cmd_fild08	mapflag	privateairship_source
+cmd_fild09	mapflag	privateairship_source
+comodo	mapflag	privateairship_source
+dali	mapflag	privateairship_source
+dali02	mapflag	privateairship_source
+dew_dun01	mapflag	privateairship_source
+dew_dun02	mapflag	privateairship_source
+dew_fild01	mapflag	privateairship_source
+dewata	mapflag	privateairship_source
+dic_dun01	mapflag	privateairship_source
+dic_dun02	mapflag	privateairship_source
+dic_dun03	mapflag	privateairship_source
+dic_fild01	mapflag	privateairship_source
+dic_fild02	mapflag	privateairship_source
+dicastes01	mapflag	privateairship_source
+dicastes02	mapflag	privateairship_source
+ecl_fild01	mapflag	privateairship_source
+ecl_tdun01	mapflag	privateairship_source
+ecl_tdun02	mapflag	privateairship_source
+ecl_tdun03	mapflag	privateairship_source
+eclage	mapflag	privateairship_source
+ein_dun01	mapflag	privateairship_source
+ein_dun02	mapflag	privateairship_source
+ein_fild01	mapflag	privateairship_source
+ein_fild03	mapflag	privateairship_source
+ein_fild04	mapflag	privateairship_source
+ein_fild05	mapflag	privateairship_source
+ein_fild06	mapflag	privateairship_source
+ein_fild07	mapflag	privateairship_source
+ein_fild08	mapflag	privateairship_source
+ein_fild09	mapflag	privateairship_source
+einbech	mapflag	privateairship_source
+einbroch	mapflag	privateairship_source
+gef_dun00	mapflag	privateairship_source
+gef_dun01	mapflag	privateairship_source
+gef_dun02	mapflag	privateairship_source
+gef_fild00	mapflag	privateairship_source
+gef_fild01	mapflag	privateairship_source
+gef_fild02	mapflag	privateairship_source
+gef_fild03	mapflag	privateairship_source
+gef_fild04	mapflag	privateairship_source
+gef_fild05	mapflag	privateairship_source
+gef_fild06	mapflag	privateairship_source
+gef_fild07	mapflag	privateairship_source
+gef_fild08	mapflag	privateairship_source
+gef_fild09	mapflag	privateairship_source
+gef_fild10	mapflag	privateairship_source
+gef_fild11	mapflag	privateairship_source
+gef_fild12	mapflag	privateairship_source
+gef_fild13	mapflag	privateairship_source
+gef_fild14	mapflag	privateairship_source
+gefenia01	mapflag	privateairship_source
+gefenia02	mapflag	privateairship_source
+gefenia03	mapflag	privateairship_source
+gefenia04	mapflag	privateairship_source
+geffen	mapflag	privateairship_source
+gl_cas01	mapflag	privateairship_source
+gl_cas02	mapflag	privateairship_source
+gl_church	mapflag	privateairship_source
+gl_chyard	mapflag	privateairship_source
+gl_dun01	mapflag	privateairship_source
+gl_dun02	mapflag	privateairship_source
+gl_in01	mapflag	privateairship_source
+gl_knt01	mapflag	privateairship_source
+gl_knt02	mapflag	privateairship_source
+gl_prison	mapflag	privateairship_source
+gl_prison1	mapflag	privateairship_source
+gl_sew01	mapflag	privateairship_source
+gl_sew02	mapflag	privateairship_source
+gl_sew03	mapflag	privateairship_source
+gl_sew04	mapflag	privateairship_source
+gl_step	mapflag	privateairship_source
+glast_01	mapflag	privateairship_source
+gon_dun01	mapflag	privateairship_source
+gon_dun02	mapflag	privateairship_source
+gon_dun03	mapflag	privateairship_source
+gon_fild01	mapflag	privateairship_source
+gonryun	mapflag	privateairship_source
+hu_fild01	mapflag	privateairship_source
+hu_fild02	mapflag	privateairship_source
+hu_fild04	mapflag	privateairship_source
+hu_fild05	mapflag	privateairship_source
+hu_fild06	mapflag	privateairship_source
+hugel	mapflag	privateairship_source
+ice_dun01	mapflag	privateairship_source
+ice_dun02	mapflag	privateairship_source
+ice_dun03	mapflag	privateairship_source
+in_sphinx1	mapflag	privateairship_source
+in_sphinx2	mapflag	privateairship_source
+in_sphinx3	mapflag	privateairship_source
+in_sphinx4	mapflag	privateairship_source
+in_sphinx5	mapflag	privateairship_source
+iz_dun00	mapflag	privateairship_source
+iz_dun01	mapflag	privateairship_source
+iz_dun02	mapflag	privateairship_source
+iz_dun03	mapflag	privateairship_source
+iz_dun04	mapflag	privateairship_source
+iz_dun05	mapflag	privateairship_source
+izlu2dun	mapflag	privateairship_source
+izlude	mapflag	privateairship_source
+jupe_core	mapflag	privateairship_source
+juperos_01	mapflag	privateairship_source
+juperos_02	mapflag	privateairship_source
+kh_dun01	mapflag	privateairship_source
+kh_dun02	mapflag	privateairship_source
+lasa_dun01	mapflag	privateairship_source
+lasa_dun02	mapflag	privateairship_source
+lasa_dun03	mapflag	privateairship_source
+lasa_fild01	mapflag	privateairship_source
+lasa_fild02	mapflag	privateairship_source
+lasagna	mapflag	privateairship_source
+lhz_dun01	mapflag	privateairship_source
+lhz_dun02	mapflag	privateairship_source
+lhz_dun03	mapflag	privateairship_source
+lhz_fild01	mapflag	privateairship_source
+lhz_fild02	mapflag	privateairship_source
+lhz_fild03	mapflag	privateairship_source
+lighthalzen	mapflag	privateairship_source
+lou_dun01	mapflag	privateairship_source
+lou_dun02	mapflag	privateairship_source
+lou_dun03	mapflag	privateairship_source
+lou_fild01	mapflag	privateairship_source
+louyang	mapflag	privateairship_source
+ma_dun01	mapflag	privateairship_source
+ma_fild01	mapflag	privateairship_source
+ma_fild02	mapflag	privateairship_source
+ma_scene01	mapflag	privateairship_source
+mag_dun01	mapflag	privateairship_source
+mag_dun02	mapflag	privateairship_source
+mal_dun01	mapflag	privateairship_source
+malangdo	mapflag	privateairship_source
+malaya	mapflag	privateairship_source
+man_fild01	mapflag	privateairship_source
+man_fild02	mapflag	privateairship_source
+man_fild03	mapflag	privateairship_source
+manuk	mapflag	privateairship_source
+mid_camp	mapflag	privateairship_source
+mjo_dun01	mapflag	privateairship_source
+mjo_dun02	mapflag	privateairship_source
+mjo_dun03	mapflag	privateairship_source
+mjolnir_01	mapflag	privateairship_source
+mjolnir_02	mapflag	privateairship_source
+mjolnir_03	mapflag	privateairship_source
+mjolnir_04	mapflag	privateairship_source
+mjolnir_05	mapflag	privateairship_source
+mjolnir_06	mapflag	privateairship_source
+mjolnir_07	mapflag	privateairship_source
+mjolnir_08	mapflag	privateairship_source
+mjolnir_09	mapflag	privateairship_source
+mjolnir_10	mapflag	privateairship_source
+mjolnir_11	mapflag	privateairship_source
+mjolnir_12	mapflag	privateairship_source
+moc_fild01	mapflag	privateairship_source
+moc_fild02	mapflag	privateairship_source
+moc_fild03	mapflag	privateairship_source
+moc_fild04	mapflag	privateairship_source
+moc_fild05	mapflag	privateairship_source
+moc_fild06	mapflag	privateairship_source
+moc_fild07	mapflag	privateairship_source
+moc_fild08	mapflag	privateairship_source
+moc_fild09	mapflag	privateairship_source
+moc_fild10	mapflag	privateairship_source
+moc_fild11	mapflag	privateairship_source
+moc_fild12	mapflag	privateairship_source
+moc_fild13	mapflag	privateairship_source
+moc_fild14	mapflag	privateairship_source
+moc_fild15	mapflag	privateairship_source
+moc_fild16	mapflag	privateairship_source
+moc_fild17	mapflag	privateairship_source
+moc_fild18	mapflag	privateairship_source
+moc_fild19	mapflag	privateairship_source
+moc_pryd01	mapflag	privateairship_source
+moc_pryd02	mapflag	privateairship_source
+moc_pryd03	mapflag	privateairship_source
+moc_pryd04	mapflag	privateairship_source
+moc_pryd05	mapflag	privateairship_source
+moc_pryd06	mapflag	privateairship_source
+moc_ruins	mapflag	privateairship_source
+mora	mapflag	privateairship_source
+moro_cav	mapflag	privateairship_source
+moro_vol	mapflag	privateairship_source
+morocc	mapflag	privateairship_source
+moscovia	mapflag	privateairship_source
+mosk_dun01	mapflag	privateairship_source
+mosk_dun02	mapflag	privateairship_source
+mosk_dun03	mapflag	privateairship_source
+mosk_fild02	mapflag	privateairship_source
+nameless_n	mapflag	privateairship_source
+nif_fild01	mapflag	privateairship_source
+nif_fild02	mapflag	privateairship_source
+niflheim	mapflag	privateairship_source
+odin_tem01	mapflag	privateairship_source
+odin_tem02	mapflag	privateairship_source
+odin_tem03	mapflag	privateairship_source
+orcsdun01	mapflag	privateairship_source
+orcsdun02	mapflag	privateairship_source
+pay_arche	mapflag	privateairship_source
+pay_dun00	mapflag	privateairship_source
+pay_dun01	mapflag	privateairship_source
+pay_dun02	mapflag	privateairship_source
+pay_dun03	mapflag	privateairship_source
+pay_dun04	mapflag	privateairship_source
+pay_fild01	mapflag	privateairship_source
+pay_fild02	mapflag	privateairship_source
+pay_fild03	mapflag	privateairship_source
+pay_fild04	mapflag	privateairship_source
+pay_fild05	mapflag	privateairship_source
+pay_fild06	mapflag	privateairship_source
+pay_fild07	mapflag	privateairship_source
+pay_fild08	mapflag	privateairship_source
+pay_fild09	mapflag	privateairship_source
+pay_fild10	mapflag	privateairship_source
+pay_fild11	mapflag	privateairship_source
+payon	mapflag	privateairship_source
+prontera	mapflag	privateairship_source
+prt_fild00	mapflag	privateairship_source
+prt_fild01	mapflag	privateairship_source
+prt_fild02	mapflag	privateairship_source
+prt_fild03	mapflag	privateairship_source
+prt_fild04	mapflag	privateairship_source
+prt_fild05	mapflag	privateairship_source
+prt_fild06	mapflag	privateairship_source
+prt_fild07	mapflag	privateairship_source
+prt_fild08	mapflag	privateairship_source
+prt_fild09	mapflag	privateairship_source
+prt_fild10	mapflag	privateairship_source
+prt_fild11	mapflag	privateairship_source
+prt_maze01	mapflag	privateairship_source
+prt_maze02	mapflag	privateairship_source
+prt_maze03	mapflag	privateairship_source
+prt_monk	mapflag	privateairship_source
+prt_sewb1	mapflag	privateairship_source
+prt_sewb2	mapflag	privateairship_source
+prt_sewb3	mapflag	privateairship_source
+prt_sewb4	mapflag	privateairship_source
+ra_fild01	mapflag	privateairship_source
+ra_fild03	mapflag	privateairship_source
+ra_fild04	mapflag	privateairship_source
+ra_fild05	mapflag	privateairship_source
+ra_fild06	mapflag	privateairship_source
+ra_fild08	mapflag	privateairship_source
+ra_fild12	mapflag	privateairship_source
+ra_san01	mapflag	privateairship_source
+ra_san02	mapflag	privateairship_source
+ra_san03	mapflag	privateairship_source
+ra_san04	mapflag	privateairship_source
+ra_san05	mapflag	privateairship_source
+ra_temple	mapflag	privateairship_source
+rachel	mapflag	privateairship_source
+spl_fild01	mapflag	privateairship_source
+spl_fild02	mapflag	privateairship_source
+spl_fild03	mapflag	privateairship_source
+splendide	mapflag	privateairship_source
+tha_t01	mapflag	privateairship_source
+tha_t02	mapflag	privateairship_source
+tha_t03	mapflag	privateairship_source
+tha_t04	mapflag	privateairship_source
+tha_t05	mapflag	privateairship_source
+tha_t06	mapflag	privateairship_source
+tha_t07	mapflag	privateairship_source
+tha_t08	mapflag	privateairship_source
+tha_t09	mapflag	privateairship_source
+tha_t10	mapflag	privateairship_source
+tha_t11	mapflag	privateairship_source
+tha_t12	mapflag	privateairship_source
+thor_v01	mapflag	privateairship_source
+thor_v02	mapflag	privateairship_source
+thor_v03	mapflag	privateairship_source
+treasure01	mapflag	privateairship_source
+treasure02	mapflag	privateairship_source
+tur_dun01	mapflag	privateairship_source
+tur_dun02	mapflag	privateairship_source
+tur_dun03	mapflag	privateairship_source
+tur_dun04	mapflag	privateairship_source
+tur_dun05	mapflag	privateairship_source
+um_fild01	mapflag	privateairship_source
+um_fild02	mapflag	privateairship_source
+um_fild03	mapflag	privateairship_source
+um_fild04	mapflag	privateairship_source
+umbala	mapflag	privateairship_source
+ve_fild01	mapflag	privateairship_source
+ve_fild02	mapflag	privateairship_source
+ve_fild03	mapflag	privateairship_source
+ve_fild04	mapflag	privateairship_source
+ve_fild06	mapflag	privateairship_source
+ve_fild07	mapflag	privateairship_source
+veins	mapflag	privateairship_source
+ver_eju	mapflag	privateairship_source
+ver_tunn	mapflag	privateairship_source
+verus03	mapflag	privateairship_source
+verus04	mapflag	privateairship_source
+yuno	mapflag	privateairship_source
+yuno_fild01	mapflag	privateairship_source
+yuno_fild02	mapflag	privateairship_source
+yuno_fild03	mapflag	privateairship_source
+yuno_fild04	mapflag	privateairship_source
+yuno_fild06	mapflag	privateairship_source
+yuno_fild07	mapflag	privateairship_source
+yuno_fild08	mapflag	privateairship_source
+yuno_fild09	mapflag	privateairship_source
+yuno_fild11	mapflag	privateairship_source
+yuno_fild12	mapflag	privateairship_source
+
+//=======================================
+// Available destination maps
+//=======================================
+abbey01	mapflag	privateairship_destination
+abbey02	mapflag	privateairship_destination
+abbey03	mapflag	privateairship_destination
+abyss_01	mapflag	privateairship_destination
+abyss_02	mapflag	privateairship_destination
+abyss_03	mapflag	privateairship_destination
+alb2trea	mapflag	privateairship_destination
+alberta	mapflag	privateairship_destination
+alde_dun01	mapflag	privateairship_destination
+alde_dun02	mapflag	privateairship_destination
+alde_dun03	mapflag	privateairship_destination
+alde_dun04	mapflag	privateairship_destination
+alde_gld	mapflag	privateairship_destination
+aldebaran	mapflag	privateairship_destination
+ama_dun01	mapflag	privateairship_destination
+ama_dun02	mapflag	privateairship_destination
+ama_dun03	mapflag	privateairship_destination
+ama_fild01	mapflag	privateairship_destination
+amatsu	mapflag	privateairship_destination
+anthell01	mapflag	privateairship_destination
+anthell02	mapflag	privateairship_destination
+aru_gld	mapflag	privateairship_destination
+ayo_dun01	mapflag	privateairship_destination
+ayo_dun02	mapflag	privateairship_destination
+ayo_fild01	mapflag	privateairship_destination
+ayothaya	mapflag	privateairship_destination
+beach_dun	mapflag	privateairship_destination
+beach_dun2	mapflag	privateairship_destination
+beach_dun3	mapflag	privateairship_destination
+bif_fild01	mapflag	privateairship_destination
+bif_fild02	mapflag	privateairship_destination
+bra_dun01	mapflag	privateairship_destination
+bra_dun02	mapflag	privateairship_destination
+bra_fild01	mapflag	privateairship_destination
+brasilis	mapflag	privateairship_destination
+c_tower1	mapflag	privateairship_destination
+c_tower2	mapflag	privateairship_destination
+c_tower3	mapflag	privateairship_destination
+c_tower4	mapflag	privateairship_destination
+cmd_fild01	mapflag	privateairship_destination
+cmd_fild02	mapflag	privateairship_destination
+cmd_fild03	mapflag	privateairship_destination
+cmd_fild04	mapflag	privateairship_destination
+cmd_fild06	mapflag	privateairship_destination
+cmd_fild07	mapflag	privateairship_destination
+cmd_fild08	mapflag	privateairship_destination
+cmd_fild09	mapflag	privateairship_destination
+comodo	mapflag	privateairship_destination
+dali	mapflag	privateairship_destination
+dali02	mapflag	privateairship_destination
+dew_dun01	mapflag	privateairship_destination
+dew_dun02	mapflag	privateairship_destination
+dew_fild01	mapflag	privateairship_destination
+dewata	mapflag	privateairship_destination
+dic_dun01	mapflag	privateairship_destination
+dic_dun02	mapflag	privateairship_destination
+dic_dun03	mapflag	privateairship_destination
+dic_fild01	mapflag	privateairship_destination
+dic_fild02	mapflag	privateairship_destination
+dicastes01	mapflag	privateairship_destination
+dicastes02	mapflag	privateairship_destination
+ecl_fild01	mapflag	privateairship_destination
+ecl_tdun01	mapflag	privateairship_destination
+ecl_tdun02	mapflag	privateairship_destination
+ecl_tdun03	mapflag	privateairship_destination
+eclage	mapflag	privateairship_destination
+ein_dun01	mapflag	privateairship_destination
+ein_dun02	mapflag	privateairship_destination
+ein_fild01	mapflag	privateairship_destination
+ein_fild03	mapflag	privateairship_destination
+ein_fild04	mapflag	privateairship_destination
+ein_fild05	mapflag	privateairship_destination
+ein_fild06	mapflag	privateairship_destination
+ein_fild07	mapflag	privateairship_destination
+ein_fild08	mapflag	privateairship_destination
+ein_fild09	mapflag	privateairship_destination
+einbech	mapflag	privateairship_destination
+einbroch	mapflag	privateairship_destination
+gef_dun00	mapflag	privateairship_destination
+gef_dun01	mapflag	privateairship_destination
+gef_dun02	mapflag	privateairship_destination
+gef_fild00	mapflag	privateairship_destination
+gef_fild01	mapflag	privateairship_destination
+gef_fild02	mapflag	privateairship_destination
+gef_fild03	mapflag	privateairship_destination
+gef_fild04	mapflag	privateairship_destination
+gef_fild05	mapflag	privateairship_destination
+gef_fild06	mapflag	privateairship_destination
+gef_fild07	mapflag	privateairship_destination
+gef_fild08	mapflag	privateairship_destination
+gef_fild09	mapflag	privateairship_destination
+gef_fild10	mapflag	privateairship_destination
+gef_fild11	mapflag	privateairship_destination
+gef_fild12	mapflag	privateairship_destination
+gef_fild13	mapflag	privateairship_destination
+gef_fild14	mapflag	privateairship_destination
+gefenia01	mapflag	privateairship_destination
+gefenia02	mapflag	privateairship_destination
+gefenia03	mapflag	privateairship_destination
+gefenia04	mapflag	privateairship_destination
+geffen	mapflag	privateairship_destination
+gl_cas01	mapflag	privateairship_destination
+gl_cas02	mapflag	privateairship_destination
+gl_church	mapflag	privateairship_destination
+gl_chyard	mapflag	privateairship_destination
+gl_dun01	mapflag	privateairship_destination
+gl_dun02	mapflag	privateairship_destination
+gl_in01	mapflag	privateairship_destination
+gl_knt01	mapflag	privateairship_destination
+gl_knt02	mapflag	privateairship_destination
+gl_prison	mapflag	privateairship_destination
+gl_prison1	mapflag	privateairship_destination
+gl_sew01	mapflag	privateairship_destination
+gl_sew02	mapflag	privateairship_destination
+gl_sew03	mapflag	privateairship_destination
+gl_sew04	mapflag	privateairship_destination
+gl_step	mapflag	privateairship_destination
+glast_01	mapflag	privateairship_destination
+gon_dun01	mapflag	privateairship_destination
+gon_dun02	mapflag	privateairship_destination
+gon_dun03	mapflag	privateairship_destination
+gon_fild01	mapflag	privateairship_destination
+gonryun	mapflag	privateairship_destination
+hu_fild01	mapflag	privateairship_destination
+hu_fild02	mapflag	privateairship_destination
+hu_fild04	mapflag	privateairship_destination
+hu_fild05	mapflag	privateairship_destination
+hu_fild06	mapflag	privateairship_destination
+hugel	mapflag	privateairship_destination
+ice_dun01	mapflag	privateairship_destination
+ice_dun02	mapflag	privateairship_destination
+ice_dun03	mapflag	privateairship_destination
+in_sphinx1	mapflag	privateairship_destination
+in_sphinx2	mapflag	privateairship_destination
+in_sphinx3	mapflag	privateairship_destination
+in_sphinx4	mapflag	privateairship_destination
+in_sphinx5	mapflag	privateairship_destination
+iz_dun00	mapflag	privateairship_destination
+iz_dun01	mapflag	privateairship_destination
+iz_dun02	mapflag	privateairship_destination
+iz_dun03	mapflag	privateairship_destination
+iz_dun04	mapflag	privateairship_destination
+iz_dun05	mapflag	privateairship_destination
+izlu2dun	mapflag	privateairship_destination
+izlude	mapflag	privateairship_destination
+jupe_core	mapflag	privateairship_destination
+juperos_01	mapflag	privateairship_destination
+juperos_02	mapflag	privateairship_destination
+kh_dun01	mapflag	privateairship_destination
+kh_dun02	mapflag	privateairship_destination
+lasa_dun01	mapflag	privateairship_destination
+lasa_dun02	mapflag	privateairship_destination
+lasa_dun03	mapflag	privateairship_destination
+lasa_fild01	mapflag	privateairship_destination
+lasa_fild02	mapflag	privateairship_destination
+lasagna	mapflag	privateairship_destination
+lhz_dun01	mapflag	privateairship_destination
+lhz_dun02	mapflag	privateairship_destination
+lhz_dun03	mapflag	privateairship_destination
+lhz_fild01	mapflag	privateairship_destination
+lhz_fild02	mapflag	privateairship_destination
+lhz_fild03	mapflag	privateairship_destination
+lighthalzen	mapflag	privateairship_destination
+lou_dun01	mapflag	privateairship_destination
+lou_dun02	mapflag	privateairship_destination
+lou_dun03	mapflag	privateairship_destination
+lou_fild01	mapflag	privateairship_destination
+louyang	mapflag	privateairship_destination
+ma_dun01	mapflag	privateairship_destination
+ma_fild01	mapflag	privateairship_destination
+ma_fild02	mapflag	privateairship_destination
+ma_scene01	mapflag	privateairship_destination
+mag_dun01	mapflag	privateairship_destination
+mag_dun02	mapflag	privateairship_destination
+mal_dun01	mapflag	privateairship_destination
+malangdo	mapflag	privateairship_destination
+malaya	mapflag	privateairship_destination
+man_fild01	mapflag	privateairship_destination
+man_fild02	mapflag	privateairship_destination
+man_fild03	mapflag	privateairship_destination
+manuk	mapflag	privateairship_destination
+mid_camp	mapflag	privateairship_destination
+mjo_dun01	mapflag	privateairship_destination
+mjo_dun02	mapflag	privateairship_destination
+mjo_dun03	mapflag	privateairship_destination
+mjolnir_01	mapflag	privateairship_destination
+mjolnir_02	mapflag	privateairship_destination
+mjolnir_03	mapflag	privateairship_destination
+mjolnir_04	mapflag	privateairship_destination
+mjolnir_05	mapflag	privateairship_destination
+mjolnir_06	mapflag	privateairship_destination
+mjolnir_07	mapflag	privateairship_destination
+mjolnir_08	mapflag	privateairship_destination
+mjolnir_09	mapflag	privateairship_destination
+mjolnir_10	mapflag	privateairship_destination
+mjolnir_11	mapflag	privateairship_destination
+mjolnir_12	mapflag	privateairship_destination
+moc_fild01	mapflag	privateairship_destination
+moc_fild02	mapflag	privateairship_destination
+moc_fild03	mapflag	privateairship_destination
+moc_fild04	mapflag	privateairship_destination
+moc_fild05	mapflag	privateairship_destination
+moc_fild06	mapflag	privateairship_destination
+moc_fild07	mapflag	privateairship_destination
+moc_fild08	mapflag	privateairship_destination
+moc_fild09	mapflag	privateairship_destination
+moc_fild10	mapflag	privateairship_destination
+moc_fild11	mapflag	privateairship_destination
+moc_fild12	mapflag	privateairship_destination
+moc_fild13	mapflag	privateairship_destination
+moc_fild14	mapflag	privateairship_destination
+moc_fild15	mapflag	privateairship_destination
+moc_fild16	mapflag	privateairship_destination
+moc_fild17	mapflag	privateairship_destination
+moc_fild18	mapflag	privateairship_destination
+moc_fild19	mapflag	privateairship_destination
+moc_pryd01	mapflag	privateairship_destination
+moc_pryd02	mapflag	privateairship_destination
+moc_pryd03	mapflag	privateairship_destination
+moc_pryd04	mapflag	privateairship_destination
+moc_pryd05	mapflag	privateairship_destination
+moc_pryd06	mapflag	privateairship_destination
+moc_ruins	mapflag	privateairship_destination
+mora	mapflag	privateairship_destination
+moro_cav	mapflag	privateairship_destination
+moro_vol	mapflag	privateairship_destination
+morocc	mapflag	privateairship_destination
+moscovia	mapflag	privateairship_destination
+mosk_dun01	mapflag	privateairship_destination
+mosk_dun02	mapflag	privateairship_destination
+mosk_dun03	mapflag	privateairship_destination
+mosk_fild02	mapflag	privateairship_destination
+nameless_n	mapflag	privateairship_destination
+nif_fild01	mapflag	privateairship_destination
+nif_fild02	mapflag	privateairship_destination
+niflheim	mapflag	privateairship_destination
+odin_tem01	mapflag	privateairship_destination
+odin_tem02	mapflag	privateairship_destination
+odin_tem03	mapflag	privateairship_destination
+orcsdun01	mapflag	privateairship_destination
+orcsdun02	mapflag	privateairship_destination
+pay_arche	mapflag	privateairship_destination
+pay_dun00	mapflag	privateairship_destination
+pay_dun01	mapflag	privateairship_destination
+pay_dun02	mapflag	privateairship_destination
+pay_dun03	mapflag	privateairship_destination
+pay_dun04	mapflag	privateairship_destination
+pay_fild01	mapflag	privateairship_destination
+pay_fild02	mapflag	privateairship_destination
+pay_fild03	mapflag	privateairship_destination
+pay_fild04	mapflag	privateairship_destination
+pay_fild05	mapflag	privateairship_destination
+pay_fild06	mapflag	privateairship_destination
+pay_fild07	mapflag	privateairship_destination
+pay_fild08	mapflag	privateairship_destination
+pay_fild09	mapflag	privateairship_destination
+pay_fild10	mapflag	privateairship_destination
+pay_fild11	mapflag	privateairship_destination
+payon	mapflag	privateairship_destination
+prontera	mapflag	privateairship_destination
+prt_fild00	mapflag	privateairship_destination
+prt_fild01	mapflag	privateairship_destination
+prt_fild02	mapflag	privateairship_destination
+prt_fild03	mapflag	privateairship_destination
+prt_fild04	mapflag	privateairship_destination
+prt_fild05	mapflag	privateairship_destination
+prt_fild06	mapflag	privateairship_destination
+prt_fild07	mapflag	privateairship_destination
+prt_fild08	mapflag	privateairship_destination
+prt_fild09	mapflag	privateairship_destination
+prt_fild10	mapflag	privateairship_destination
+prt_fild11	mapflag	privateairship_destination
+prt_maze01	mapflag	privateairship_destination
+prt_maze02	mapflag	privateairship_destination
+prt_maze03	mapflag	privateairship_destination
+prt_monk	mapflag	privateairship_destination
+prt_sewb1	mapflag	privateairship_destination
+prt_sewb2	mapflag	privateairship_destination
+prt_sewb3	mapflag	privateairship_destination
+prt_sewb4	mapflag	privateairship_destination
+ra_fild01	mapflag	privateairship_destination
+ra_fild03	mapflag	privateairship_destination
+ra_fild04	mapflag	privateairship_destination
+ra_fild05	mapflag	privateairship_destination
+ra_fild06	mapflag	privateairship_destination
+ra_fild08	mapflag	privateairship_destination
+ra_fild12	mapflag	privateairship_destination
+ra_san01	mapflag	privateairship_destination
+ra_san02	mapflag	privateairship_destination
+ra_san03	mapflag	privateairship_destination
+ra_san04	mapflag	privateairship_destination
+ra_san05	mapflag	privateairship_destination
+ra_temple	mapflag	privateairship_destination
+rachel	mapflag	privateairship_destination
+spl_fild01	mapflag	privateairship_destination
+spl_fild02	mapflag	privateairship_destination
+spl_fild03	mapflag	privateairship_destination
+splendide	mapflag	privateairship_destination
+tha_t01	mapflag	privateairship_destination
+tha_t02	mapflag	privateairship_destination
+tha_t03	mapflag	privateairship_destination
+tha_t04	mapflag	privateairship_destination
+tha_t05	mapflag	privateairship_destination
+tha_t06	mapflag	privateairship_destination
+tha_t07	mapflag	privateairship_destination
+tha_t08	mapflag	privateairship_destination
+tha_t09	mapflag	privateairship_destination
+tha_t10	mapflag	privateairship_destination
+tha_t11	mapflag	privateairship_destination
+tha_t12	mapflag	privateairship_destination
+thor_v01	mapflag	privateairship_destination
+thor_v02	mapflag	privateairship_destination
+thor_v03	mapflag	privateairship_destination
+treasure01	mapflag	privateairship_destination
+treasure02	mapflag	privateairship_destination
+tur_dun01	mapflag	privateairship_destination
+tur_dun02	mapflag	privateairship_destination
+tur_dun03	mapflag	privateairship_destination
+tur_dun04	mapflag	privateairship_destination
+tur_dun05	mapflag	privateairship_destination
+um_fild01	mapflag	privateairship_destination
+um_fild02	mapflag	privateairship_destination
+um_fild03	mapflag	privateairship_destination
+um_fild04	mapflag	privateairship_destination
+umbala	mapflag	privateairship_destination
+ve_fild01	mapflag	privateairship_destination
+ve_fild02	mapflag	privateairship_destination
+ve_fild03	mapflag	privateairship_destination
+ve_fild04	mapflag	privateairship_destination
+ve_fild06	mapflag	privateairship_destination
+ve_fild07	mapflag	privateairship_destination
+veins	mapflag	privateairship_destination
+ver_eju	mapflag	privateairship_destination
+ver_tunn	mapflag	privateairship_destination
+verus03	mapflag	privateairship_destination
+verus04	mapflag	privateairship_destination
+yuno	mapflag	privateairship_destination
+yuno_fild01	mapflag	privateairship_destination
+yuno_fild02	mapflag	privateairship_destination
+yuno_fild03	mapflag	privateairship_destination
+yuno_fild04	mapflag	privateairship_destination
+yuno_fild06	mapflag	privateairship_destination
+yuno_fild07	mapflag	privateairship_destination
+yuno_fild08	mapflag	privateairship_destination
+yuno_fild09	mapflag	privateairship_destination
+yuno_fild11	mapflag	privateairship_destination
+yuno_fild12	mapflag	privateairship_destination

+ 1 - 0
npc/re/scripts_mapflags.conf

@@ -13,6 +13,7 @@ npc: npc/re/mapflag/nosave.txt
 npc: npc/re/mapflag/noteleport.txt
 npc: npc/re/mapflag/nowarpto.txt
 //npc: npc/re/mapflag/partylock.txt
+npc: npc/re/mapflag/privateairship.txt
 npc: npc/re/mapflag/night.txt
 npc: npc/re/mapflag/restricted.txt
 npc: npc/re/mapflag/town.txt

+ 2 - 1
sql-files/logs.sql

@@ -165,12 +165,13 @@ CREATE TABLE IF NOT EXISTS `npclog` (
 # Lotter(Y)
 # (Z) Merged Items
 # (Q)uest
+# Private Airs(H)ip
 
 CREATE TABLE IF NOT EXISTS `picklog` (
   `id` int(11) NOT NULL auto_increment,
   `time` datetime NOT NULL,
   `char_id` int(11) NOT NULL default '0',
-  `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$','F','Y','Z','Q') NOT NULL default 'P',
+  `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$','F','Y','Z','Q','H') NOT NULL default 'P',
   `nameid` smallint(5) unsigned NOT NULL default '0',
   `amount` int(11) NOT NULL default '1',
   `refine` tinyint(3) unsigned NOT NULL default '0',

+ 2 - 0
sql-files/upgrades/upgrade_20180729_logs.sql

@@ -0,0 +1,2 @@
+ALTER TABLE `picklog`
+	MODIFY COLUMN `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$','F','Y','Z','Q','H') NOT NULL default 'P';

+ 8 - 0
src/map/battle.cpp

@@ -8505,6 +8505,7 @@ static const struct _battle_data {
 	{ "summoner_trait",                     &battle_config.summoner_trait,                  3,      0,      3,              },
 	{ "homunculus_autofeed_always",         &battle_config.homunculus_autofeed_always,      1,      0,      1,              },
 	{ "feature.attendance",                 &battle_config.feature_attendance,              1,      0,      1,              },
+	{ "feature.privateairship",             &battle_config.feature_privateairship,          1,      0,      1,              },
 
 #include "../custom/battle_config_init.inc"
 };
@@ -8649,6 +8650,13 @@ void battle_adjust_conf()
 	}
 #endif
 
+#if PACKETVER < 20180321
+	if( battle_config.feature_privateairship ){
+		ShowWarning("conf/battle/feature.conf private airship system is enabled but it requires PACKETVER 2018-03-21 or newer, disabling...\n");
+		battle_config.feature_privateairship = 0;
+	}
+#endif
+
 #ifndef CELL_NOSTACK
 	if (battle_config.custom_cell_stack_limit != 1)
 		ShowWarning("Battle setting 'custom_cell_stack_limit' takes no effect as this server was compiled without Cell Stack Limit support.\n");

+ 1 - 0
src/map/battle.hpp

@@ -645,6 +645,7 @@ struct Battle_Config
 	int summoner_trait;
 	int homunculus_autofeed_always;
 	int feature_attendance;
+	int feature_privateairship;
 
 #include "../custom/battle_config_struct.inc"
 };

+ 115 - 0
src/map/clif.cpp

@@ -20388,6 +20388,121 @@ void clif_weight_limit( struct map_session_data* sd ){
 #endif
 }
 
+enum e_private_airship_response : uint32{
+	PRIVATEAIRSHIP_OK,
+	PRIVATEAIRSHIP_RETRY,
+	PRIVATEAIRSHIP_ITEM_NOT_ENOUGH,
+	PRIVATEAIRSHIP_DESTINATION_MAP_INVALID,
+	PRIVATEAIRSHIP_SOURCE_MAP_INVALID,
+	PRIVATEAIRSHIP_ITEM_UNAVAILABLE
+};
+
+/// Send out the response to a private airship request
+/// 0A4A <response>.L
+void clif_private_airship_response( struct map_session_data* sd, enum e_private_airship_response response ){
+#if PACKETVER >= 20180321
+	nullpo_retv( sd );
+
+	int fd = sd->fd;
+
+	WFIFOHEAD( fd, packet_len( 0xA4A ) );
+	WFIFOW( fd, 0 ) = 0xA4A;
+	WFIFOL( fd, 2 ) = response;
+	WFIFOSET( fd, packet_len( 0xA4A ) );
+#endif
+}
+
+/// Parses a request for a private airship
+/// 0A49 <mapname>.16B <itemid>.W
+void clif_parse_private_airship_request( int fd, struct map_session_data* sd ){
+#if PACKETVER >= 20180321
+	// Check if the feature is enabled
+	if( !battle_config.feature_privateairship ){
+		clif_messagecolor( &sd->bl, color_table[COLOR_RED], msg_txt( sd, 792 ), false, SELF ); // The private airship system is disabled.
+		return;
+	}
+
+	// Check if the player is allowed to warp from the source map
+	if( !map_getmapflag( sd->bl.m, MF_PRIVATEAIRSHIP_SOURCE ) ){
+		clif_private_airship_response( sd, PRIVATEAIRSHIP_SOURCE_MAP_INVALID );
+		return;
+	}
+
+	char mapname[MAP_NAME_LENGTH_EXT];
+
+	safestrncpy( mapname, RFIFOCP( fd, 2 ), MAP_NAME_LENGTH_EXT );
+
+	int16 mapindex = mapindex_name2id( mapname );
+
+	// Check if we know the mapname
+	if( mapindex < 0 ){
+		clif_private_airship_response( sd, PRIVATEAIRSHIP_DESTINATION_MAP_INVALID );
+		return;
+	}
+
+	int16 mapid = map_mapindex2mapid( mapindex );
+
+	// Check if the map is available on this server
+	if( mapid < 0 ){
+		// TODO: add multi map-server support, cant validate the mapflags of the other server
+		return;
+	}
+
+	// Check if the player tried to warp to the map he is on
+	if( sd->bl.m == mapid ){
+		// This is blocked by the client, but just to be sure
+		return;
+	}
+
+	// This can only be a hack, so we prevent it
+	if( map_getmapdata( mapid )->instance_id ){
+		// Ignore requests to warp directly into a running instance
+		return;
+	}
+
+	// Check if the player is allowed to warp to the target map
+	if( !map_getmapflag( mapid, MF_PRIVATEAIRSHIP_DESTINATION ) ){
+		clif_private_airship_response( sd, PRIVATEAIRSHIP_DESTINATION_MAP_INVALID );
+		return;
+	}
+
+	// The UI only offers these two buttons(items) for now
+	uint16 item_ids[] = {
+		ITEMID_ACTINIDIA_CAT_FRUIT,
+		ITEMID_WORLD_MOVING_RIGHTS
+	};
+
+	uint16 item_id = RFIFOW( fd, 2 + MAP_NAME_LENGTH_EXT );
+
+	int i;
+
+	ARR_FIND( 0, ARRAYLENGTH( item_ids ), i, item_ids[i] == item_id );
+
+	// Check if the item sent by the client is known to us
+	if( i == ARRAYLENGTH( item_ids ) ){
+		clif_private_airship_response( sd, PRIVATEAIRSHIP_ITEM_UNAVAILABLE );
+		return;
+	}
+	
+	int idx = pc_search_inventory( sd, item_id );
+
+	// Check if the player has the item at all
+	if( idx < 0 ){
+		clif_private_airship_response( sd, PRIVATEAIRSHIP_ITEM_NOT_ENOUGH );
+		return;
+	}
+
+	// Delete the chosen item
+	if( pc_delitem( sd, idx, 1, 0, 0, LOG_TYPE_PRIVATE_AIRSHIP ) ){
+		clif_private_airship_response( sd, PRIVATEAIRSHIP_RETRY );
+		return;
+	}
+
+	// Warp the player to a random spot on the destination map
+	pc_setpos( sd, mapindex, 0, 0, CLR_TELEPORT );
+#endif
+}
+
 /*==========================================
  * Main client packet processing function
  *------------------------------------------*/

+ 1 - 1
src/map/clif_packetdb.hpp

@@ -2396,7 +2396,7 @@
 
 // 2018-03-21aRagexeRE
 #if PACKETVER >= 20180321
-	parseable_packet(0x0A49,20,clif_parse_dull,0);
+	parseable_packet(0x0A49,20,clif_parse_private_airship_request,0);
 	packet(0x0A4A,6);
 	packet(0x0A4B,22);
 	packet(0x0A4C,28);

+ 2 - 0
src/map/itemdb.hpp

@@ -80,6 +80,7 @@ enum item_itemid
 	ITEMID_PAINT_BRUSH					= 6122,
 	ITEMID_MAGIC_GEAR_FUEL				= 6146,
 	ITEMID_STRANGE_EMBRYO				= 6415,
+	ITEMID_ACTINIDIA_CAT_FRUIT			= 6909,
 	ITEMID_STONE						= 7049,
 	ITEMID_FIRE_BOTTLE					= 7135,
 	ITEMID_ACID_BOTTLE					= 7136,
@@ -120,6 +121,7 @@ enum item_itemid
 	ITEMID_WOB_RACHEL					= 14584,
 	ITEMID_WOB_LOCAL					= 14585,
 	ITEMID_SIEGE_TELEPORT_SCROLL		= 14591,
+	ITEMID_WORLD_MOVING_RIGHTS			= 25464,
 };
 
 ///Rune Knight

+ 1 - 0
src/map/log.cpp

@@ -84,6 +84,7 @@ static char log_picktype2char(e_log_pick_type type)
 		case LOG_TYPE_ROULETTE:			return 'Y';  // Roulette Lotter(Y)
 		case LOG_TYPE_MERGE_ITEM:		return 'Z';  // Merged Item
 		case LOG_TYPE_QUEST:			return 'Q';  // (Q)uest Item
+		case LOG_TYPE_PRIVATE_AIRSHIP:	return 'H';  // Private Airs(H)ip
 	}
 
 	// should not get here, fallback

+ 1 - 0
src/map/log.hpp

@@ -49,6 +49,7 @@ enum e_log_pick_type : uint32
 	LOG_TYPE_ROULETTE         = 0x100000,
 	LOG_TYPE_MERGE_ITEM       = 0x200000,
 	LOG_TYPE_QUEST            = 0x400000,
+	LOG_TYPE_PRIVATE_AIRSHIP  = 0x800000,
 	// combinations
 	LOG_TYPE_LOOT             = LOG_TYPE_PICKDROP_MONSTER|LOG_TYPE_CONSUME,
 	// all

+ 2 - 0
src/map/map.hpp

@@ -587,6 +587,8 @@ enum e_mapflag : int16 {
 	MF_HIDEMOBHPBAR,
 	MF_NOLOOT,
 	MF_NOEXP,
+	MF_PRIVATEAIRSHIP_SOURCE,
+	MF_PRIVATEAIRSHIP_DESTINATION,
 	MF_MAX
 };
 

+ 2 - 0
src/map/script_constants.hpp

@@ -453,6 +453,8 @@
 	export_constant(MF_HIDEMOBHPBAR);
 	export_constant(MF_NOLOOT);
 	export_constant(MF_NOEXP);
+	export_constant(MF_PRIVATEAIRSHIP_SOURCE);
+	export_constant(MF_PRIVATEAIRSHIP_DESTINATION);
 
 	/* setcell types */
 	export_constant(CELL_WALKABLE);