Merge branch 'master' of https://github.com/ronancpl/HeavenMS into credits_update
This commit is contained in:
8
.gitignore
vendored
8
.gitignore
vendored
@@ -71,10 +71,18 @@
|
||||
/tools/MapleInvalidItemWithNoNameFetcher/dist/
|
||||
/tools/MapleInvalidItemWithNoNameFetcher/nbproject/
|
||||
|
||||
/tools/MapleMapFieldLimitChecker/build/
|
||||
/tools/MapleMapFieldLimitChecker/dist/
|
||||
/tools/MapleMapFieldLimitChecker/nbproject/
|
||||
|
||||
/tools/MapleMapInfoRetriever/build/
|
||||
/tools/MapleMapInfoRetriever/dist/
|
||||
/tools/MapleMapInfoRetriever/nbproject/
|
||||
|
||||
/tools/MapleMapLootLimitChecker/build/
|
||||
/tools/MapleMapLootLimitChecker/dist/
|
||||
/tools/MapleMapLootLimitChecker/nbproject/
|
||||
|
||||
/tools/MapleMesoFetcher/build/
|
||||
/tools/MapleMesoFetcher/dist/
|
||||
/tools/MapleMesoFetcher/nbproject/
|
||||
|
||||
@@ -6,4 +6,4 @@ WORKDIR /mnt
|
||||
COPY ./ ./
|
||||
RUN sh ./posix-compile.sh
|
||||
EXPOSE 8484 7575 7576 7577
|
||||
CMD exec tini -- sh ./docker-launch.sh
|
||||
CMD exec tini -- sh ./posix-launch.sh
|
||||
36
README.md
36
README.md
@@ -6,10 +6,14 @@ Besides myself for maintaining this repository, credits are to be given to Wizet
|
||||
|
||||
Regarding distributability and usage of the code presented here: like it was before, this MapleStory server is open-source. By that, it is meant that anyone is **free to install, use, modify and redistribute the contents**, as long as there is **no kind of commercial trading involved** and the **credits to the original creators are maintained** within the codes.
|
||||
|
||||
This is a NetBeans 8.0.2 Project, that MUST be built and run on Java 7 (JDK/JRE 1.7.0_79+) in order to run properly. This means that it's easier to install the project via opening the server project folder inside NetBeans' IDE. Once installed, build this project on your machine and run the server using the "launch.bat" application.
|
||||
This is a NetBeans 8.2 Project, that should be built and run on Java 8 in order to run properly (used to be ran in Java 7, thanks @kolakcc for the Java 8 support!).
|
||||
|
||||
Being a NetBeans 8.2 Project, this means that it's easier to install the project via opening the server project folder inside NetBeans' IDE. Once installed, build this project on your machine and run the server using the "launch.bat" application.
|
||||
|
||||
In this project, many gameplay-wise issues generated from either the original WZ files and the server source have been partially or completely solved. Considering the use of the provided edited WZ's and server-side wz.xml files should be of the greatest importance when dealing with this instance of server source, in order to perceive it at it's full potential. My opinion, though!
|
||||
|
||||
- In other case, as fallback from the provided ones, consider using **whole clean set**. Selecting part of the provided ones to play pretty much *may eventually* lead to unexpected issues.
|
||||
|
||||
The main objective of this project is to try as best as possible to recreate what once was the original MapleStory v83, while adding up some flavors that spices up the gameplay. In other words, aim to get the best of the MapleStory of that era.
|
||||
|
||||
---
|
||||
@@ -19,17 +23,21 @@ Server files: https://github.com/ronancpl/HeavenMS
|
||||
|
||||
Client files & general tools: https://drive.google.com/drive/folders/0BzDsHSr-0V4MYVJ0TWIxd05hYUk
|
||||
|
||||
Java7 SDK: https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
|
||||
Java 8 SDK & NetBeans bundle: https://www.oracle.com/technetwork/pt/java/javase/downloads/jdk-netbeans-jsp-3413153-ptb.html
|
||||
|
||||
**Important note about localhosts**: these executables are red-flagged by antivirus tools as __potentially malicious softwares__, this happens due to the reverse engineering methods that were applied onto these software artifacts. Those depicted here have been put to use for years already and posed no harm so far, so they are soundly assumed to be safe.
|
||||
|
||||
Latest localhost: https://hostr.co/itrvrHapvtEg
|
||||
Latest localhost: https://hostr.co/amuX5SLeeVZx
|
||||
|
||||
The following list, in bottom-up chronological order, holds information regarding all changes that were applied from the starting localhost used in this development. Some lines have a link attached, that will lead you to a snapshot of the localhost at that version of the artifact. Naturally, later versions holds all previous changes along with the proposed changes.
|
||||
|
||||
**Change log:**
|
||||
|
||||
* Fixed Monster Magnet crashing the caster when trying to pull-in bosses.
|
||||
* Cleared need for administrator privileges (OS) to play the game, credits to Ubaware.
|
||||
|
||||
* Set a higher cap for AP assigning with AP Reset, credits to Ubaware.
|
||||
|
||||
* Fixed Monster Magnet crashing the caster when trying to pull bosses. Drawback: Dojo HPBar becomes unavailable. https://hostr.co/SvnSKrGzXhG0
|
||||
|
||||
* Fixed some 'rn' problems with quest icons & removed "tab" from party leader changed message. https://hostr.co/tsYsQzzV6xT0
|
||||
|
||||
@@ -131,18 +139,14 @@ Firstly, install all the general tools required to run the server:
|
||||
* mysql-query-browser.msi -> MySQL client component, visually shows the DB data and hubs queries.
|
||||
* hamachi.msi -> used for establishing a tunnelling route for the server/client communication.
|
||||
|
||||
|
||||
Now install the Java 7 Development Kit:
|
||||
|
||||
* jdk-7u79-windows-x64.exe
|
||||
* netbeans-8.0.2-javase-windows.exe -> It's a NetBeans project, use other IDE at your own risk.
|
||||
Now install the Java 8 SDK & NetBeans bundle:
|
||||
* jdk-8u111-nb-8_2-windows-x64.exe -> It's a NetBeans project, use other IDE at your own risk.
|
||||
|
||||
Now that the tools have been installed, test if they are working.
|
||||
|
||||
For WampServer:
|
||||
|
||||
* Once you're done installing it, run it and you will see the Wamp icon on the bottom right corner.
|
||||
Left click it and click 'Put Online'.
|
||||
* Once you're done installing it, run it and you will see the Wamp icon on the bottom right corner. Left click it and click 'Put Online'.
|
||||
* In case of ORANGE ICON, change port 80 at "httpd.conf" to another, as it clashes with a Windows default port. Then Left click it again and click 'Start All Services'.
|
||||
* The Wamp icon must look completely green (if its orange or red, you have a problem).
|
||||
|
||||
@@ -161,7 +165,9 @@ For expediency, "HeavenMS-master" folder on this guide will be referred just as
|
||||
|
||||
Setting up the SQL: open MySQL Query Browser, then create a new session with the parameters below, then click OK.
|
||||
|
||||
Server Host: localhost Port: 3306 Username: root
|
||||
* Server Host: localhost
|
||||
* Port: 3306
|
||||
* Username: root
|
||||
|
||||
Now it must be done CAREFULLY:
|
||||
|
||||
@@ -183,9 +189,7 @@ Now open NetBeans, and click "Open a project..." . Select then the "HeavenMS" fo
|
||||
|
||||
Inside the project, you may encounter some code errors.
|
||||
|
||||
Firstly, a **new Java7 platform** must be defined to run the server. Click "Manage Platforms...", then "Add platform", browse through "C:\Program Files\Java" for the JDK 1.7 folder. Then, name this new platform "JDK 1.7".
|
||||
|
||||
In case errors still show up, these errors probably occurs because you have yet to set the core JARs of the project. From the project hierarchy, right-click the project and select "Resolve Project Problems".
|
||||
If that's the case, you have yet to set the core JARs of the project. From the project hierarchy, right-click the project and select "Resolve Project Problems".
|
||||
|
||||
Locate the folder "cores" inside the root directory of this project and manually configure the missing files on NetBeans (mina-core, slf4j-api, ...).
|
||||
|
||||
@@ -247,7 +251,7 @@ To change a character's GM level, make sure that character is not logged in, the
|
||||
---
|
||||
### Some notes about WZ/WZ.XML EDITING
|
||||
|
||||
NOTE: Be extremely wary when using server-side's XMLs data being reimporting into the client's WZ, as some means of synchronization between the server and client modules, this action COULD generate some kind of bugs afterwards. Client-to-server data reimporting seems to be fine, though.
|
||||
NOTE: Be extremely wary when using server-side's XMLs data being reimported into the client's WZ, as some means of synchronization between the server and client modules, this action COULD generate some kind of bugs afterwards. Client-to-server data reimporting seems to be fine, though.
|
||||
|
||||
#### Editing the v83 WZ's:
|
||||
|
||||
|
||||
459
config.yaml
Normal file
459
config.yaml
Normal file
@@ -0,0 +1,459 @@
|
||||
#World Name: (0 "Scania", 1 "Bera", 2 "Broa", 3 "Windia", 4 "Khaini", 5 "Bellocan", 6 "Mardia", 7 "Kradia", 8 "Yellonde", 9 "Demethos", 10 "Galicia", 11 "El Nido", 12 "Zenith", 13 "Arcenia", 14 "Kastia", 15 "Judis", 16 "Plana", 17 "Kalluna", 18 "Stius", 19 "Croa", 20 "Medere")
|
||||
#Flag types: (0 = nothing, 1 = event, 2 = new, 3 = hot)
|
||||
#Recommended to use only up to 15 worlds
|
||||
worlds:
|
||||
#Properties for Scania 0
|
||||
- flag: 0
|
||||
server_message: Welcome to Scania!
|
||||
event_message: Scania!
|
||||
why_am_i_recommended: Welcome to Scania!
|
||||
channels: 3
|
||||
exp_rate: 10
|
||||
meso_rate: 10
|
||||
drop_rate: 10
|
||||
boss_drop_rate: 10 #NOTE: Boss drop rate OVERRIDES common drop rate, for bosses-only.
|
||||
quest_rate: 5 #Multiplier for Exp & Meso gains when completing a quest. Only available when USE_QUEST_RATE is true. Stacks with server Exp & Meso rates.
|
||||
fishing_rate: 10 #Multiplier for success likelihood on meso thrown during fishing.
|
||||
travel_rate: 10 #Means of transportation rides/departs using 1/N of the default time.
|
||||
|
||||
#Properties for Bera 1
|
||||
- flag: 0
|
||||
server_message: Welcome to Bera!
|
||||
event_message: Bera!
|
||||
why_am_i_recommended: Welcome to Bera!
|
||||
channels: 3
|
||||
|
||||
#Properties for Broa 2
|
||||
- flag: 0
|
||||
server_message: Welcome to Broa!
|
||||
event_message: Broa!
|
||||
why_am_i_recommended: Welcome to Broa!
|
||||
channels: 3
|
||||
|
||||
#Properties for Windia 3
|
||||
- flag: 0
|
||||
server_message: Welcome to Windia!
|
||||
event_message: Windia!
|
||||
why_am_i_recommended: Welcome to Windia!
|
||||
channels: 3
|
||||
|
||||
#Properties for Khaini 4
|
||||
- flag: 0
|
||||
server_message: Welcome to Khaini!
|
||||
event_message: Khaini!
|
||||
why_am_i_recommended: Welcome to Khaini!
|
||||
channels: 3
|
||||
|
||||
#Properties for Bellocan 5
|
||||
- flag: 0
|
||||
server_message: Welcome to Bellocan!
|
||||
event_message: Bellocan!
|
||||
why_am_i_recommended: Welcome to Bellocan!
|
||||
channels: 3
|
||||
|
||||
#Properties for Mardia 6
|
||||
- flag: 0
|
||||
server_message: Welcome to Mardia!
|
||||
event_message: Mardia!
|
||||
why_am_i_recommended: Welcome to Mardia!
|
||||
channels: 3
|
||||
|
||||
#Properties for Kradia 7
|
||||
- flag: 0
|
||||
server_message: Welcome to Kradia!
|
||||
event_message: Kradia!
|
||||
why_am_i_recommended: Welcome to Kradia!
|
||||
channels: 3
|
||||
|
||||
#Properties for Yellonde 8
|
||||
- flag: 0
|
||||
server_message: Welcome to Yellonde!
|
||||
event_message: Yellonde!
|
||||
why_am_i_recommended: Welcome to Yellonde!
|
||||
channels: 3
|
||||
|
||||
#Properties for Demethos 9
|
||||
- flag: 0
|
||||
server_message: Welcome to Demethos!
|
||||
event_message: Demethos!
|
||||
why_am_i_recommended: Welcome to Demethos!
|
||||
channels: 3
|
||||
|
||||
#Properties for Galicia 10
|
||||
- flag: 0
|
||||
server_message: Welcome to Galicia!
|
||||
event_message: Galicia!
|
||||
why_am_i_recommended: Welcome to Galicia!
|
||||
channels: 3
|
||||
|
||||
#Properties for El Nido 11
|
||||
- flag: 0
|
||||
server_message: Welcome to El Nido!
|
||||
event_message: El Nido!
|
||||
why_am_i_recommended: Welcome to El Nido!
|
||||
channels: 3
|
||||
|
||||
#Properties for Zenith 12
|
||||
- flag: 0
|
||||
server_message: Welcome to Zenith!
|
||||
event_message: Zenith!
|
||||
why_am_i_recommended: Welcome to Zenith!
|
||||
channels: 3
|
||||
|
||||
#Properties for Arcenia 13
|
||||
- flag: 0
|
||||
server_message: Welcome to Arcenia!
|
||||
event_message: Arcenia!
|
||||
why_am_i_recommended: Welcome to Arcenia!
|
||||
channels: 3
|
||||
|
||||
#Properties for Kastia 14
|
||||
- flag: 0
|
||||
server_message: Welcome to Kastia!
|
||||
event_message: Kastia!
|
||||
why_am_i_recommended: Welcome to Kastia!
|
||||
channels: 3
|
||||
|
||||
#Properties for Judis 15
|
||||
- flag: 0
|
||||
server_message: Welcome to Judis!
|
||||
event_message: Judis!
|
||||
why_am_i_recommended: Welcome to Judis!
|
||||
channels: 3
|
||||
|
||||
#Properties for Plana 16
|
||||
- flag: 0
|
||||
server_message: Welcome to Plana!
|
||||
event_message: Plana!
|
||||
why_am_i_recommended: Welcome to Plana!
|
||||
channels: 3
|
||||
|
||||
#Properties for Kalluna 17
|
||||
- flag: 0
|
||||
server_message: Welcome to Kalluna!
|
||||
event_message: Kalluna!
|
||||
why_am_i_recommended: Welcome to Kalluna!
|
||||
channels: 3
|
||||
|
||||
#Properties for Stius 18
|
||||
- flag: 0
|
||||
server_message: Welcome to Stius!
|
||||
event_message: Stius!
|
||||
why_am_i_recommended: Welcome to Stius!
|
||||
channels: 3
|
||||
|
||||
#Properties for Croa 19
|
||||
- flag: 0
|
||||
server_message: Welcome to Croa!
|
||||
event_message: Croa!
|
||||
why_am_i_recommended: Welcome to Croa!
|
||||
channels: 3
|
||||
|
||||
#Properties for Medere 20
|
||||
- flag: 0
|
||||
server_message: Welcome to Medere!
|
||||
event_message: Medere!
|
||||
why_am_i_recommended: Welcome to Medere!
|
||||
channels: 3
|
||||
|
||||
|
||||
server:
|
||||
#Thread Tracker Configuration
|
||||
USE_THREAD_TRACKER: true #[SEVERE] This deadlock auditing thing will bloat the memory as fast as the time frame one takes to lose track of a raindrop on a tempesting day. Only for debugging purposes.
|
||||
|
||||
#Database Configuration
|
||||
DB_URL: "jdbc:mysql://localhost:3306/heavenms"
|
||||
DB_USER: "root"
|
||||
DB_PASS: ""
|
||||
DB_CONNECTION_POOL: true #Installs a connection pool to hub DB connections. Set false to default.
|
||||
|
||||
#Login Configuration
|
||||
WORLDS: 1 #Initial number of worlds on the server.
|
||||
WLDLIST_SIZE: 21 #Max possible worlds on the server.
|
||||
CHANNEL_SIZE: 20 #Max possible channels per world (which is 20, based on the channel list on login phase).
|
||||
CHANNEL_LOAD: 100 #Max players per channel (limit actually used to calculate the World server capacity).
|
||||
CHANNEL_LOCKS: 20 #Total number of structure management locks each channel has.
|
||||
|
||||
RESPAWN_INTERVAL: 10000 #10 seconds, 10000.
|
||||
PURGING_INTERVAL: 300000 #5 minutes, 300000.
|
||||
RANKING_INTERVAL: 3600000 #60 minutes, 3600000.
|
||||
COUPON_INTERVAL: 3600000 #60 minutes, 3600000.
|
||||
UPDATE_INTERVAL: 777 #Dictates the frequency on which the "centralized server time" is updated.
|
||||
|
||||
ENABLE_PIC: false #Pick true/false to enable or disable Pic. Delete character requires PIC available.
|
||||
ENABLE_PIN: false #Pick true/false to enable or disable Pin.
|
||||
|
||||
BYPASS_PIC_EXPIRATION: 20 #Enables PIC bypass, which will remain active for that account by that client machine for N minutes. Set 0 to disable.
|
||||
BYPASS_PIN_EXPIRATION: 15 #Enables PIN bypass, which will remain active for that account by that client machine for N minutes. Set 0 to disable.
|
||||
|
||||
AUTOMATIC_REGISTER: true #Automatically register players when they login with a nonexistent username.
|
||||
BCRYPT_MIGRATION: true #Performs a migration from old SHA-1 and SHA-512 password to bcrypt.
|
||||
COLLECTIVE_CHARSLOT: false #Available character slots are contabilized globally rather than per world server.
|
||||
DETERRED_MULTICLIENT: false #Enables detection of multi-client and suspicious remote IP on the login system.
|
||||
#Besides blocking logging in with several client sessions on the same machine, this also blocks suspicious login attempts for players that tries to login on an account using several diferent remote addresses.
|
||||
|
||||
#Multiclient Coordinator Configuration
|
||||
MAX_ALLOWED_ACCOUNT_HWID: 4 #Allows up to N concurrent HWID's for an account. HWID's remains linked to an account longer the more times it's used to login.
|
||||
MAX_ACCOUNT_LOGIN_ATTEMPT: 15 #After N tries on an account, login on that account gets disabled for a short period.
|
||||
LOGIN_ATTEMPT_DURATION: 120 #Period in seconds the login attempt remains registered on the system.
|
||||
|
||||
#Ip Configuration
|
||||
HOST: 127.0.0.1
|
||||
LOCALSERVER: true
|
||||
GMSERVER: false
|
||||
|
||||
#Other configuration
|
||||
SHUTDOWNHOOK: true
|
||||
|
||||
#Server Flags
|
||||
USE_CUSTOM_KEYSET: true #Enables auto-setup of the HeavenMS's custom keybindings when creating characters.
|
||||
USE_DEBUG: false #Will enable some text prints on the client, oriented for debugging purposes.
|
||||
USE_DEBUG_SHOW_INFO_EQPEXP: false #Prints on the cmd all equip exp gain info.
|
||||
USE_DEBUG_SHOW_RCVD_PACKET: false #Prints on the cmd all received packet ids.
|
||||
USE_DEBUG_SHOW_RCVD_MVLIFE: false #Prints on the cmd all received move life content.
|
||||
USE_DEBUG_SHOW_PACKET: false
|
||||
USE_SUPPLY_RATE_COUPONS: true #Allows rate coupons to be sold through the Cash Shop.
|
||||
USE_IP_VALIDATION: true #Enables IP checking when logging in.
|
||||
USE_CHARACTER_ACCOUNT_CHECK: false #Enables one-character-per-account check when logging in. This might be resource intensive.
|
||||
|
||||
USE_MAXRANGE: true #Will send and receive packets from all events on a map, rather than those of only view range.
|
||||
USE_MAXRANGE_ECHO_OF_HERO: true
|
||||
USE_MTS: false
|
||||
USE_CPQ: true #Renders the CPQ available or not.
|
||||
USE_AUTOHIDE_GM: false #When enabled, GMs are automatically hidden when joining. Thanks to Steven Deblois (steven1152).
|
||||
USE_BUYBACK_SYSTEM: true #Enables the HeavenMS-builtin buyback system, to be used by dead players when clicking the MTS button.
|
||||
USE_FIXED_RATIO_HPMP_UPDATE: true #Enables the HeavenMS-builtin HPMP update based on the current pool to max pool ratio.
|
||||
USE_FAMILY_SYSTEM: true
|
||||
USE_DUEY: true
|
||||
USE_RANDOMIZE_HPMP_GAIN: true #Enables randomizing on MaxHP/MaxMP gains and INT accounting for the MaxMP gain on level up.
|
||||
USE_STORAGE_ITEM_SORT: true #Enables storage "Arrange Items" feature.
|
||||
USE_ITEM_SORT: true #Enables inventory "Item Sort/Merge" feature.
|
||||
USE_ITEM_SORT_BY_NAME: false #Item sorting based on name rather than id.
|
||||
USE_PARTY_FOR_STARTERS: true #Players level 10 or below can create/invite other players on the given level range.
|
||||
USE_AUTOASSIGN_STARTERS_AP: false #Beginners level 10 or below have their AP autoassigned (they can't choose to levelup a stat). Set true ONLY if the localhost doesn't support AP assigning for beginners level 10 or below.
|
||||
USE_AUTOASSIGN_SECONDARY_CAP: true #Prevents AP autoassign from spending on secondary stats after the player class' cap (defined on the autoassign handler) has been reached.
|
||||
USE_STARTING_AP_4: true #Use early-GMS 4/4/4/4 starting stats. To overcome AP shortage, this gives 4AP/5AP at 1st/2nd job advancements.
|
||||
USE_AUTOBAN: false #Commands the server to detect infractors automatically.
|
||||
USE_AUTOBAN_LOG: true #Log autoban related messages. Still logs even with USE_AUTOBAN disabled.
|
||||
USE_AUTOSAVE: true #Enables server autosaving feature (saves characters to DB each 1 hour).
|
||||
USE_SERVER_AUTOASSIGNER: true #HeavenMS-builtin autoassigner, uses algorithm based on distributing AP accordingly with required secondary stat on equipments.
|
||||
USE_REFRESH_RANK_MOVE: true
|
||||
USE_ENFORCE_ADMIN_ACCOUNT: false #Forces accounts having GM characters to be treated as a "GM account" by the client (localhost). Some of the GM account perks is the ability to FLY, but unable to TRADE.
|
||||
USE_ENFORCE_NOVICE_EXPRATE: true #Hardsets experience rate 1x for beginners level 10 or under. Ideal for roaming on novice areas without caring too much about losing some stats.
|
||||
USE_ENFORCE_HPMP_SWAP: false #Forces players to reuse stats (via AP Resetting) located on HP/MP pool only inside the HP/MP stats.
|
||||
USE_ENFORCE_MOB_LEVEL_RANGE: true #Players N levels below the killed mob will gain no experience from defeating it.
|
||||
USE_ENFORCE_JOB_LEVEL_RANGE: false #Caps the player level on the minimum required to advance their current jobs.
|
||||
USE_ENFORCE_JOB_SP_RANGE: false #Caps the player SP level on the total obtainable by their current jobs. After changing jobs, missing SP will be retrieved.
|
||||
USE_ENFORCE_ITEM_SUGGESTION: false #Forces the Owl of Minerva and the Cash Shop to always display the defined item array instead of those featured by the players.
|
||||
USE_ENFORCE_UNMERCHABLE_CASH: true #Forces players to not sell CASH items via merchants, drops of it disappears.
|
||||
USE_ENFORCE_UNMERCHABLE_PET: true #Forces players to not sell pets via merchants, drops of it disappears. (since non-named pets gets dirty name and other possible DB-related issues)
|
||||
USE_ENFORCE_MERCHANT_SAVE: true #Forces automatic DB save on merchant owners, at every item movement on shop.
|
||||
USE_ENFORCE_MDOOR_POSITION: false #Forces mystic door to be spawned near spawnpoints.
|
||||
USE_SPAWN_CLEAN_MDOOR: false #Makes mystic doors to be spawned without deploy animation. This clears disconnecting issues that may happen when trying to cancel doors a couple seconds after deployment.
|
||||
USE_SPAWN_LOOT_ON_ANIMATION: false #Makes loot appear some time after the mob has been killed (following the mob death animation, instead of instantly).
|
||||
USE_SPAWN_RELEVANT_LOOT: true #Forces to only spawn loots that are collectable by the player or any of their party members.
|
||||
USE_ERASE_PERMIT_ON_OPENSHOP: true #Forces "shop permit" item to be consumed when player deploy his/her player shop.
|
||||
USE_ERASE_UNTRADEABLE_DROP: true #Forces flagged untradeable items to disappear when dropped.
|
||||
USE_ERASE_PET_ON_EXPIRATION: false #Forces pets to be removed from inventory when expire time comes, rather than converting it to a doll.
|
||||
USE_BUFF_MOST_SIGNIFICANT: true #When applying buffs, the player will stick with the highest stat boost among the listed, rather than overwriting stats.
|
||||
USE_BUFF_EVERLASTING: false #Every applied buff on players holds expiration time so high it'd be considered permanent. Suggestion thanks to Vcoc.
|
||||
USE_MULTIPLE_SAME_EQUIP_DROP: true #Enables multiple drops by mobs of the same equipment, number of possible drops based on the quantities provided at the drop data.
|
||||
USE_BANISHABLE_TOWN_SCROLL: true #Enables town scrolls to act as if it's a "player banish", rendering the antibanish scroll effect available.
|
||||
USE_ENABLE_FULL_RESPAWN: true #At respawn task, always respawn missing mobs when they're available. Spawn count doesn't depend on how many players are currently there.
|
||||
USE_ENABLE_CHAT_LOG: false #Write in-game chat to log
|
||||
USE_REBIRTH_SYSTEM: false #Flag to enable/disable rebirth system
|
||||
USE_MAP_OWNERSHIP_SYSTEM: true #Flag to enable/disable map ownership system
|
||||
USE_FISHING_SYSTEM: true #Flag to enable/disable custom fishing system
|
||||
USE_NPCS_SCRIPTABLE: true #Flag to enable/disable serverside predefined script NPCs.
|
||||
|
||||
#Events/PQs Configuration
|
||||
USE_OLD_GMS_STYLED_PQ_NPCS: true #Enables PQ NPCs with similar behaviour to old GMS style, that skips info about the PQs and immediately tries to register the party in.
|
||||
USE_ENABLE_SOLO_EXPEDITIONS: true #Enables start expeditions with any number of players. This will also bypass all the Zakum prequest.
|
||||
USE_ENABLE_DAILY_EXPEDITIONS: false #Enables daily entry limitations in expeditions.
|
||||
USE_ENABLE_RECALL_EVENT: false #Enables a disconnected player to reaccess the last event instance they were in before logging out. Recall only works if the event isn't cleared or disposed yet. Suggestion thanks to Alisson (Goukken).
|
||||
|
||||
#Announcement Configuration
|
||||
USE_ANNOUNCE_SHOPITEMSOLD: false #Automatic message sent to owner when an item from the Player Shop or Hired Merchant is sold.
|
||||
USE_ANNOUNCE_CHANGEJOB: false #Automatic message sent to acquantainces when changing jobs.
|
||||
|
||||
#Cash Shop Configuration
|
||||
USE_JOINT_CASHSHOP_INVENTORY: true #Enables usage of a same cash shop inventory for explorers, cygnus and legends. Items from exclusive cash shop inventories won't show up on the shared inventory, though.
|
||||
USE_CLEAR_OUTDATED_COUPONS: true #Enables deletion of older code coupon registry from the DB, freeing so-long irrelevant data.
|
||||
ALLOW_CASHSHOP_NAME_CHANGE: true #Allows players to buy name changes in the cash shop.
|
||||
ALLOW_CASHSHOP_WORLD_TRANSFER: true #Allows players to buy world transfers in the cash shop.
|
||||
|
||||
#Maker Configuration
|
||||
USE_MAKER_PERMISSIVE_ATKUP: true #Allows players to use attack-based strengthening gems on non-weapon items.
|
||||
USE_MAKER_FEE_HEURISTICS: true #Apply compiled values for stimulants and reagents into the Maker fee calculations (max error revolves around 50k mesos). Set false to use basic constant values instead (results are never higher than requested by the client-side).
|
||||
|
||||
#Custom Configuration
|
||||
USE_ENABLE_CUSTOM_NPC_SCRIPT: true #Enables usage of custom HeavenMS NPC scripts (Agent E, Coco, etc). Will not disable Abdula (it's actually useful for the gameplay) or quests.
|
||||
USE_STARTER_MERGE: false #Allows any players to use the Equipment Merge custom mechanic (as opposed to the high-level, Maker lv3 requisites).
|
||||
|
||||
#Commands Configuration
|
||||
BLOCK_GENERATE_CASH_ITEM: false #Prevents creation of cash items with the item/drop command.
|
||||
USE_WHOLE_SERVER_RANKING: false #Enables a ranking pool made from every character registered on the server for the "ranks" command, instead of separated by worlds.
|
||||
|
||||
EQUIP_EXP_RATE: 1.0 #Rate for equipment exp gain, grows linearly. Set 1.0 for default (about 100~200 same-level range mobs killed to pass equip from level 1 to 2).
|
||||
PQ_BONUS_EXP_RATE: 0.5 #Rate for the PQ exp reward.
|
||||
|
||||
EXP_SPLIT_LEVEL_INTERVAL: 5 #Non-contributing players must be within N level between the mob to receive EXP.
|
||||
EXP_SPLIT_LEECH_INTERVAL: 5 #Non-contributing players must be within N level between any contributing party member to receive EXP.
|
||||
EXP_SPLIT_MVP_MOD: 0.2
|
||||
EXP_SPLIT_COMMON_MOD: 0.8
|
||||
PARTY_BONUS_EXP_RATE: 1.0 #Rate for the party exp bonus reward.
|
||||
|
||||
#Miscellaneous Configuration
|
||||
TIMEZONE: GMT-3
|
||||
USE_DISPLAY_NUMBERS_WITH_COMMA: true #Enforce comma on displayed strings (use this when USE_UNITPRICE_WITH_COMMA is active and you still want to display comma-separated values).
|
||||
USE_UNITPRICE_WITH_COMMA: true #Set this accordingly with the layout of the unitPrices on Item.wz XML's, whether it's using commas or dots to represent fractions.
|
||||
MAX_MONITORED_BUFFSTATS: 5 #Limits accounting for "dormant" buff effects, that should take place when stronger stat buffs expires.
|
||||
MAX_AP: 32767 #Max AP allotted on the auto-assigner.
|
||||
MAX_EVENT_LEVELS: 8 #Event has different levels of rewarding system.
|
||||
BLOCK_NPC_RACE_CONDT: 500 # (0.5 * 1000) Time the player client must wait before reopening a conversation with an NPC.
|
||||
TOT_MOB_QUEST_REQUIREMENT: 77 #Overwrites old 999-mobs requirement for the ToT questline with new requirement value, set 0 for default.
|
||||
MOB_REACTOR_REFRESH_TIME: 30000 # (30 * 1000) Overwrites refresh time for those reactors oriented to inflict damage to bosses (Ice Queen, Riche), set 0 for default.
|
||||
PARTY_SEARCH_REENTRY_LIMIT: 10 #Max amount of times a party leader is allowed to persist on the Party Search before entry expiration (thus needing to manually restart the Party Search to be able to search for members).
|
||||
NAME_CHANGE_COOLDOWN: 2592000000 # (30*24*60*60*1000) Cooldown for name changes, default (GMS) is 30 days.
|
||||
WORLD_TRANSFER_COOLDOWN: 2592000000 # (30*24*60*60*1000) Cooldown for world tranfers, default is same as name change (30 days).
|
||||
INSTANT_NAME_CHANGE: false #Whether or not to wait for server restart to apply name changes. Does on reconnect otherwise (requires queries on every login).
|
||||
|
||||
#Dangling Items/Locks Configuration
|
||||
ITEM_EXPIRE_TIME: 180000 # (3 * 60 * 1000) Time before items start disappearing. Recommended to be set up to 3 minutes.
|
||||
KITE_EXPIRE_TIME: 3600000 # (60 * 60 * 1000) Time before kites (cash item) disappears.
|
||||
ITEM_MONITOR_TIME: 300000 # (5 * 60 * 1000) Interval between item monitoring tasks on maps, which checks for dangling (null) item objects on the map item history.
|
||||
LOCK_MONITOR_TIME: 30000 # (30 * 1000) Waiting time for a lock to be released. If it reaches timeout, a critical server deadlock has made present.
|
||||
|
||||
#Map Monitor Configuration
|
||||
ITEM_EXPIRE_CHECK: 10000 # (10 * 10000) Interval between item expiring tasks on maps, which checks and makes disappear expired items.
|
||||
ITEM_LIMIT_ON_MAP: 200 #Max number of items allowed on a map.
|
||||
MAP_VISITED_SIZE: 5 #Max length for last mapids visited by a player. This is used to recover and update drops on these maps accordingly with player actions.
|
||||
MAP_DAMAGE_OVERTIME_INTERVAL: 5000 #Interval in milliseconds between map environment damage (e.g. El Nath and Aqua Road surrondings).
|
||||
|
||||
#Channel Mob Disease Monitor Configuration
|
||||
MOB_STATUS_MONITOR_PROC: 200 #Frequency in milliseconds between each proc on the mob disease monitor schedule.
|
||||
MOB_STATUS_MONITOR_LIFE: 84 #Idle proc count the mob disease monitor is allowed to be there before closing it due to inactivity.
|
||||
MOB_STATUS_AGGRO_PERSISTENCE: 2 #Idle proc count on aggro update for a mob to keep following the current controller, given him/her is the leading damage dealer.
|
||||
MOB_STATUS_AGGRO_INTERVAL: 5000 #Interval in milliseconds between aggro logistics update.
|
||||
|
||||
#Some Gameplay Enhancing Configurations
|
||||
#Scroll Configuration
|
||||
USE_PERFECT_GM_SCROLL: true #Scrolls from GMs never uses up slots nor fails.
|
||||
USE_PERFECT_SCROLLING: true #Scrolls doesn't use slots upon failure.
|
||||
USE_ENHANCED_CHSCROLL: true #Equips even more powerful with chaos upgrade.
|
||||
USE_ENHANCED_CRAFTING: true #Apply chaos scroll on every equip crafted.
|
||||
USE_ENHANCED_CLNSLATE: true #Clean slates can be applied to recover successfully used slots as well.
|
||||
SCROLL_CHANCE_ROLLS: 10 #Number of rolls for success on a scroll, set 1 for default.
|
||||
CHSCROLL_STAT_RATE: 3 #Number of rolls of stat upgrade on a successfully applied chaos scroll, set 1 for default.
|
||||
CHSCROLL_STAT_RANGE: 6 #Stat upgrade range (-N, N) on chaos scrolls.
|
||||
|
||||
#Beginner Skills Configuration
|
||||
USE_ULTRA_NIMBLE_FEET: true #Massive speed & jump upgrade.
|
||||
USE_ULTRA_RECOVERY: true #Massive recovery amounts overtime.
|
||||
USE_ULTRA_THREE_SNAILS: true #Massive damage on shell toss.
|
||||
|
||||
#Other Skills Configuration
|
||||
USE_FULL_ARAN_SKILLSET: false #Enables starter availability to all Aran job skills. Suggestion thanks to Masterrulax.
|
||||
USE_FAST_REUSE_HERO_WILL: true #Greatly reduce cooldown on Hero's Will.
|
||||
USE_ANTI_IMMUNITY_CRASH: true #Crash skills additionally removes the mob's invincibility buffs. Suggestion thanks to Celestial.
|
||||
USE_UNDISPEL_HOLY_SHIELD: true #Holy shield buff also prevents players from suffering dispel from mobs.
|
||||
USE_FULL_HOLY_SYMBOL: true #Holy symbol doesn't require EXP sharers to work in full.
|
||||
|
||||
#Character Configuration
|
||||
USE_ADD_SLOTS_BY_LEVEL: true #Slots are added each 20 levels.
|
||||
USE_ADD_RATES_BY_LEVEL: true #Rates are added each 20 levels.
|
||||
USE_STACK_COUPON_RATES: false #Multiple coupons effects builds up together.
|
||||
USE_PERFECT_PITCH: true #For lvl 30 or above, each lvlup grants player 1 perfect pitch.
|
||||
|
||||
#Quest Configuration
|
||||
USE_QUEST_RATE: false #Exp/Meso gained by quests uses fixed server exp/meso rate times quest rate as multiplier, instead of player rates.
|
||||
|
||||
#Quest Points Configuration
|
||||
QUEST_POINT_REPEATABLE_INTERVAL: 24 #Minimum interval between repeatable quest completions for quest points to be awarded.
|
||||
QUEST_POINT_REQUIREMENT: 16 #Exchange factor between N quest points to +1 fame, set 0 to disable the entire quest point mechanism.
|
||||
QUEST_POINT_PER_QUEST_COMPLETE: 4 #Each completed quest awards N quest points, set 0 to disable.
|
||||
QUEST_POINT_PER_EVENT_CLEAR: 1 #Each completed event instance awards N quest points, set 0 to disable.
|
||||
|
||||
#Guild Configuration
|
||||
CREATE_GUILD_MIN_PARTNERS: 6 #Minimum number of members on Guild Headquarters to establish a new guild.
|
||||
CREATE_GUILD_COST: 1500000
|
||||
CHANGE_EMBLEM_COST: 5000000
|
||||
EXPAND_GUILD_BASE_COST: 500000
|
||||
EXPAND_GUILD_TIER_COST: 1000000
|
||||
EXPAND_GUILD_MAX_COST: 5000000
|
||||
|
||||
#Family Configuration
|
||||
FAMILY_REP_PER_KILL: 4 #Amount of rep gained per monster kill.
|
||||
FAMILY_REP_PER_BOSS_KILL: 20 #Amount of rep gained per boss kill.
|
||||
FAMILY_REP_PER_LEVELUP: 200 #Amount of rep gained upon leveling up.
|
||||
FAMILY_MAX_GENERATIONS: 1000 #Maximum depth of family tree. (Distance from leader to farthest junior)
|
||||
|
||||
#Equipment Configuration
|
||||
USE_EQUIPMNT_LVLUP_SLOTS: true #Equips can upgrade slots at level up.
|
||||
USE_EQUIPMNT_LVLUP_POWER: true #Enable more powerful stat upgrades at equip level up.
|
||||
USE_EQUIPMNT_LVLUP_CASH: true #Enable equip leveling up on cash equipments as well.
|
||||
USE_SPIKES_AVOID_BANISH: true #Shoes equipped with spikes prevents mobs from banishing wearer.
|
||||
MAX_EQUIPMNT_LVLUP_STAT_UP: 10000 #Max stat upgrade an equipment can have on a levelup.
|
||||
MAX_EQUIPMNT_STAT: 32767 #Max stat on an equipment by leveling up.
|
||||
USE_EQUIPMNT_LVLUP: 7 #All equips lvlup at max level of N, set 1 to disable.
|
||||
|
||||
#Map-Chair Configuration
|
||||
USE_CHAIR_EXTRAHEAL: true #Enable map chairs to further recover player's HP and MP (player must have the Chair Mastery skill).
|
||||
CHAIR_EXTRA_HEAL_MULTIPLIER: 10 #Due to only being able to be send up-to-255 heal values, values being actually updated is the one displayed times this.
|
||||
CHAIR_EXTRA_HEAL_MAX_DELAY: 21 #Players are expected to recover fully after using this skill for N seconds.
|
||||
|
||||
#Player NPC Configuration
|
||||
PLAYERNPC_INITIAL_X: 262 #Map frame width for putting PlayerNPCs.
|
||||
PLAYERNPC_INITIAL_Y: 262 #Map frame height for putting PlayerNPCs.
|
||||
PLAYERNPC_AREA_X: 320 #Initial width gap between PlayerNPCs.
|
||||
PLAYERNPC_AREA_Y: 160 #Initial height gap between PlayerNPCs.
|
||||
PLAYERNPC_AREA_STEPS: 4 #Max number of times gap is shortened to comport PlayerNPCs.
|
||||
PLAYERNPC_ORGANIZE_AREA: true #Automatically rearranges PlayerNPCs on the map if there is no space set the new NPC. Current distance gap between NPCs is decreased to solve this issue.
|
||||
PLAYERNPC_AUTODEPLOY: true #Makes PlayerNPC automatically deployed on the Hall of Fame at the instant one reaches max level. If false, eligible players must talk to 1st job instructor to deploy a NPC.
|
||||
|
||||
#Pet Auto-Pot Configuration
|
||||
USE_COMPULSORY_AUTOPOT: true #Pets will consume as many potions as needed to fulfill the AUTOHP/MP ratio threshold.
|
||||
USE_EQUIPS_ON_AUTOPOT: true #Player MaxHP and MaxMP check values on autopot handler will be updated by the HP/MP bonuses on equipped items.
|
||||
PET_AUTOHP_RATIO: 0.99 #Will automatically consume potions until given ratio of the MaxHP/MaxMP is reached.
|
||||
PET_AUTOMP_RATIO: 0.99
|
||||
|
||||
#Pet & Mount Configuration
|
||||
PET_EXHAUST_COUNT: 3 #Number of proc counts (1 per minute) on the exhaust schedule for fullness.
|
||||
MOUNT_EXHAUST_COUNT: 1 #Number of proc counts (1 per minute) on the exhaust schedule for tiredness.
|
||||
|
||||
#Pet Hunger Configuration
|
||||
PETS_NEVER_HUNGRY: false #If true, pets and mounts will never grow hungry.
|
||||
GM_PETS_NEVER_HUNGRY: true #If true, pets and mounts owned by GMs will never grow hungry.
|
||||
|
||||
#Event Configuration
|
||||
EVENT_MAX_GUILD_QUEUE: 10 #Max number of guilds in queue for GPQ.
|
||||
EVENT_LOBBY_DELAY: 10 #Cooldown duration in seconds before reopening an event lobby.
|
||||
|
||||
#Dojo Configuration
|
||||
USE_FAST_DOJO_UPGRADE: true #Reduced Dojo training points amount required for a belt upgrade.
|
||||
USE_DEADLY_DOJO: false #Should bosses really use 1HP,1MP attacks in dojo?
|
||||
DOJO_ENERGY_ATK: 100 #Dojo energy gain when deal attack
|
||||
DOJO_ENERGY_DMG: 20 #Dojo energy gain when recv attack
|
||||
|
||||
#Wedding Configuration
|
||||
WEDDING_RESERVATION_DELAY: 3 #Minimum idle slots before processing a wedding reservation.
|
||||
WEDDING_RESERVATION_TIMEOUT: 10 #Limit time in minutes for the couple to show up before cancelling the wedding reservation.
|
||||
WEDDING_RESERVATION_INTERVAL: 60 #Time between wedding starts in minutes.
|
||||
WEDDING_BLESS_EXP: 30000 #Exp gained per bless count.
|
||||
WEDDING_GIFT_LIMIT: 1 #Max number of gifts per person to same wishlist on marriage instances.
|
||||
WEDDING_BLESSER_SHOWFX: true #Pops bubble sprite effect on players blessing the couple. Setting this false shows the blessing effect on the couple instead.
|
||||
|
||||
#Buyback Configuration
|
||||
USE_BUYBACK_WITH_MESOS: true #Enables usage of either mesos or NX for the buyback fee.
|
||||
BUYBACK_FEE: 77.70 #Sets the base amount needed to buyback (level 30 or under will use the base value).
|
||||
BUYBACK_LEVEL_STACK_FEE: 85.47 #Sets the level-stacking portion of the amount needed to buyback (fee will sum up linearly until level 120, when it reaches the peak).
|
||||
BUYBACK_MESO_MULTIPLIER: 1000 #Sets a multiplier for the fee when using meso as the charge unit.
|
||||
BUYBACK_RETURN_MINUTES: 1 #Sets the maximum amount of time the player can wait before decide to buyback.
|
||||
BUYBACK_COOLDOWN_MINUTES: 7 #Sets the time the player must wait before using buyback again.
|
||||
|
||||
# Login timeout by shavit
|
||||
TIMEOUT_DURATION: 3600000 # Kicks clients who don't send any packet to the game server in due time (in millisseconds).
|
||||
|
||||
#Event End Timestamp
|
||||
EVENT_END_TIMESTAMP: 1428897600000
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
HOST=127.0.0.1
|
||||
URL=jdbc:mysql://localhost:3306/heavenms
|
||||
DB_USER=root
|
||||
DB_PASS=
|
||||
JAVA8=FALSE
|
||||
SHUTDOWNHOOK=true
|
||||
BIN
cores/yamlbeans-1.13.jar
Normal file
BIN
cores/yamlbeans-1.13.jar
Normal file
Binary file not shown.
@@ -1,8 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
sed -i "s/HOST=.*/HOST=${HOST}/" configuration.ini
|
||||
sed -i "s|URL=.*|URL=${URL}|" configuration.ini
|
||||
sed -i "s/DB_USER=.*/DB_USER=${DB_USER}/" configuration.ini
|
||||
sed -i "s/DB_PASS=.*/DB_PASS=${DB_PASS}/" configuration.ini
|
||||
|
||||
exec sh ./posix-launch.sh
|
||||
35
docs/area_bosses/AreaBoss.js
Normal file
35
docs/area_bosses/AreaBoss.js
Normal file
@@ -0,0 +1,35 @@
|
||||
// @Author: Resinate
|
||||
|
||||
importPackage(Packages.server.life);
|
||||
importPackage(Packages.tools);
|
||||
|
||||
var towns = new Array(800020120, 251010102, 260010201, 107000300, 200010300, 100040105, 100040106, 261030000, 110040000, 240040401, 104000400, 222010310, 230040420, 230040420, 230020100, 105090310, 101030404, 250010304, 220050100, 220050000, 220050200, 221040301);
|
||||
var spawns = new Array(6090002, 5220004, 3220001, 6220000, 8220000, 5220002, 5220002, 8220002, 5220001, 8220003, 2220000, 7220001, 8510000, 8520000, 4220001, 8220008, 3220000, 7220000, 5220003, 5220003, 5220003, 6220001);
|
||||
var x = new Array(560, 560, 645, 90, 208, 456, 474, -300, 200, 0, 400, 0, 527, 138, 0, -626, 800, -300, -300, 0, 0, -4224);
|
||||
var y = new Array(50, 50, 275, 119, 83, 278, 278, 180, 140, 1125, 455, 33, -437, 138, 520, -604, 1280, 390, 1030, 1030, 1030, 776);
|
||||
var mapObj;
|
||||
var mobObj;
|
||||
|
||||
function init() {
|
||||
scheduleNew();
|
||||
}
|
||||
|
||||
function scheduleNew() {
|
||||
setupTask = em.schedule("start", 0);
|
||||
}
|
||||
|
||||
function cancelSchedule() {
|
||||
if (setupTask != null)
|
||||
setupTask.cancel(true);
|
||||
}
|
||||
|
||||
function start() {
|
||||
for(var i = 0; i < towns.length; i++) {
|
||||
mapObj = em.getChannelServer().getMapFactory().getMap(towns[i]);
|
||||
mobObj = MapleLifeFactory.getMonster(spawns[i]);
|
||||
if(mapObj.getMonsterById(spawns[i]) == null) {
|
||||
mapObj.spawnMonsterOnGroundBelow(mobObj, new Packages.java.awt.Point(x[i],y[i]));
|
||||
}
|
||||
}
|
||||
setupTask = em.schedule("start", 30 * 60 * 1000);
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// @Author: Resinate
|
||||
|
||||
var towns = new Array(800020120, 251010102, 260010201, 107000300, 200010300, 100040105, 100040106, 261030000, 110040000, 250010504, 240040401, 104000400, 222010310, 230040420, 230040420, 230020100, 105090310, 101030404, 250010304, 220050100, 220050000, 220050200, 221040301);
|
||||
var spawns = new Array(6090002, 5220004, 3220001, 6220000, 8220000, 5220002, 5220002, 8220002, 5220001, 7220002, 8220003, 2220000, 7220001, 8510000, 8520000, 4220001, 8220008, 3220000, 7220000, 5220003, 5220003, 5220003, 6220001);
|
||||
var x = new Array(560, 560, 645, 90, 208, 456, 474, -300, 200, 400, 0, 400, 0, 527, 138, 0, -626, 800, -300, -300, 0, 0, -4224);
|
||||
var y = new Array(50, 50, 275, 119, 83, 278, 278, 180, 140, 540, 1125, 455, 33, -437, 138, 520, -604, 1280, 390, 1030, 1030, 1030, 776);
|
||||
var mapObj;
|
||||
var mobObj;
|
||||
|
||||
function init() {
|
||||
scheduleNew();
|
||||
}
|
||||
|
||||
function scheduleNew() {
|
||||
setupTask = em.schedule("start", 0);
|
||||
}
|
||||
|
||||
function cancelSchedule() {
|
||||
if (setupTask != null)
|
||||
setupTask.cancel(true);
|
||||
}
|
||||
|
||||
function start() {
|
||||
var time = (Math.floor(Math.random() * 10) + 10) * (60 * 1000);
|
||||
for(var i = 0; i < towns.length; i++) {
|
||||
mapObj = em.getChannelServer().getMapFactory().getMap(towns[i]);
|
||||
mobObj = Packages.server.life.MapleLifeFactory.getMonster(spawns[i]);
|
||||
if(mapObj.getMonsterById(spawns[i]) == null) {
|
||||
mapObj.spawnMonsterOnGroundBelow(mobObj, new Packages.java.awt.Point(x[i],y[i]));
|
||||
}
|
||||
}
|
||||
em.schedule("start", time);
|
||||
}
|
||||
@@ -10,12 +10,15 @@ Known issues:
|
||||
- If there are multiple bosses that shows HPBar on the map, if a player hits more than one the HPBar may start flickering on the screen.
|
||||
- Sometimes battleship may behave oddly with the enhanced buff system, making the character d/c in certain scenarios.
|
||||
- Dragon Roar doesn't show the stun effect to players.
|
||||
- Cygnus job 'Final Attack' skills not functional.
|
||||
- Steal skill doesn't deduct the loot from the drop pool from a mob.
|
||||
- Snipe will show much higher damage value than actually applicable to the attacker.
|
||||
- Some monster status such as freeze and weapon/magic reflect doesn't behave properly in certain scenarios. Freeze seems to not work on mobs with low OID or are starters from server boot time.
|
||||
- Some monster status such as weapon/magic reflect doesn't behave properly in certain scenarios.
|
||||
- On low-end connections, things such as command summoning a player that is currently logging in (already visible to other players) may cause the player to freeze, consequently freezing the account as well since the server-side disconnection doesn't happen.
|
||||
- Reportedly, there are cases where mob positions fail to sync between player's client-view.
|
||||
- Visual equip EXP watch value will present stuttering for early levels requirement (EXP needed less than 100), and requirement at level 200 will not progress at all due to the level cap in client.
|
||||
- Monster Magnet will crash the player when trying to pull fixed monsters.
|
||||
- Some magic skills such as "Energy Bolt" or "Holy Arrow" doesn't display damage to other players when the attacks come from close range to the targeted mob. Oddly enough, using "closeRangeAttack" packet seems to clear the issue on most skills, however in others "Error 5" crash renders this unusable.
|
||||
---------------------------
|
||||
|
||||
---------------------------
|
||||
@@ -29,15 +32,13 @@ Missing features list:
|
||||
|
||||
---------------------------
|
||||
** Others **
|
||||
- GM Events (Snowball, OX, Fitness)
|
||||
- Family system
|
||||
- MTS
|
||||
---------------------------
|
||||
|
||||
|
||||
---------------------------
|
||||
** Quest **
|
||||
- Family & Medal quests.
|
||||
- Medal quests.
|
||||
---------------------------
|
||||
|
||||
|
||||
@@ -48,7 +49,7 @@ Missing features list:
|
||||
|
||||
---------------------------
|
||||
** Packet issues & advanced PQs **
|
||||
- Mystic Doors (won't deploy players properly is some situations, only destination map matches).
|
||||
- Mystic Doors (won't deploy players properly in some situations, only destination map matches).
|
||||
- Nett's Pyramid Party Quest
|
||||
---------------------------
|
||||
|
||||
|
||||
@@ -2,10 +2,7 @@
|
||||
|
||||
Uncoded features:
|
||||
NX Format
|
||||
Name Change
|
||||
World transfer
|
||||
MTS (v53)
|
||||
Family system (v67)
|
||||
Family and Medal Quests(?)
|
||||
|
||||
Uncoded Party Quests:
|
||||
|
||||
@@ -1950,3 +1950,327 @@ Normalizado uso de lobbyids em início de eventos nos scripts.
|
||||
|
||||
15 Junho 2019,
|
||||
Corrigido limites de requisitos de nível para acessar expedições nos scripts de NPCs que as gerenciam.
|
||||
|
||||
19 Junho 2019,
|
||||
Corrigido janela congelada de Legendary Spirit ao tentar aplicar scrolls em equipamentos sem slots.
|
||||
Ajustado chance de drops de skillbooks.
|
||||
Revisado funcionalidade de arrendamento de mapas. Jogadores não mais perdem posse ao trocar de mapas, somente ao expirar devido à falta de atividades ou ao tentar arrendar outro mapa.
|
||||
Revisado expedições retirando jogadores assim que o líder sai de mapa ou não há mais em campo a quantidade mínima de jogadores requisitada para começar o evento.
|
||||
Corrigido gerenciador de mapas finalizando antes dos eventos, potencialmente levando a quebra de scripts de evento durante a fase de shutdown do servidor.
|
||||
Corrigido comandos de começar/completar quests não atuando para quests não previstas pelos XMLs.
|
||||
Revisado sistema de quests desnecessariamente inicializando estruturas de leitura de XMLs.
|
||||
Corrigido sistema de quests no objeto do jogador não acessando corretamente certas quests devido a uso indevido de inteiros de tamanho short e int.
|
||||
|
||||
20 Junho 2019,
|
||||
Implementado sistema de contabilização de entradas em bosses.
|
||||
Corrigido potencial exploit com expressão facial podendo crashar jogadores ao receber expressão inválida.
|
||||
|
||||
21 - 22 Junho 2019,
|
||||
Ajustado data no Duey, que estava atuando de forma inesperada anteriormente.
|
||||
Adicionado checagem contra potenciais exploits de dano dado em mobs por mobs ou summons em seus respectivos handlers.
|
||||
Adicionado checagem contra potenciais exploits por itens nos handlers de cadeira e expressão facial.
|
||||
Ajustado checagem contra potenciais exploits de distância/inexistência de NPC na área onde o jogador se encontra, ao se realizar operações sobre quests.
|
||||
Refatorado função que modifica estado de mob aliado no mapa (no lado servidor) sendo executada dentro de definição de pacote.
|
||||
Implementado suporte para entrega rápida pelo Duey.
|
||||
|
||||
24 - 25 Junho 2019,
|
||||
Corrigido Horntail não dropando itens após mudança recente na lógica de drops.
|
||||
Revisado sistema de comandos. Cada comando no sistema é inicializado somente uma vez, ao iniciar o servidor.
|
||||
Ajustado Maker skill, agora utilizando pacotes de resultados ao realizar suas operações.
|
||||
Corrigido Mini Dungeons utilizando tempo limite pré-determinado no código-fonte.
|
||||
Revisado utilização de "timeLimit" em objeto MapleMap. Valor supostamente pré-determinado pela receita XML poderia ser sobrescrito por outros métodos da classe.
|
||||
Ajustado evento de Gaga no espaço, evento agora funcional.
|
||||
Adicionado minigame RPS de NPC, recursos implementados pelo Arnah.
|
||||
|
||||
27 Junho 2019,
|
||||
Corrigido contabilização de dano de auto-destruição de mobs não sendo aplicado corretamente.
|
||||
|
||||
01 Julho 2019,
|
||||
Corrigido contabilização de entrada em bosses não checando criação de expedições.
|
||||
Corrigido caso de overflow em valor máximo calculado de dano em skills.
|
||||
Implementado retirada de itens mantidos pelo Duey na DB, após dado a data de expirar.
|
||||
|
||||
02 Julho 2019,
|
||||
Refatorado flags de itens utilizando tamanho menor que o esperado.
|
||||
Adicionado checagem por FieldLimit ao lançar itens em mapas dados como "untradeable".
|
||||
Adicionado funcionalidade "Quest Item Restore".
|
||||
|
||||
11 Julho 2019,
|
||||
Implementado instanciação de flag "somente compartilhável dentro de mesma conta" em itens recém-gerados que possuem essa funcionalidade.
|
||||
Implementado atualização de estados no portão de entrada do Papulatus.
|
||||
Corrigido deslize apontado pelo Conrad, na aplicação de caixas de limites usados pelos buffs em área.
|
||||
Implementado finalização de instância de minidungeon assim que o líder de party sai da área ou há troca de líderes com alguém fora da área.
|
||||
|
||||
14 Julho 2019,
|
||||
Refatorado atributos de HenesysPQ sendo utilizados em objetos de áreas do jogo.
|
||||
Corrigido mobs aliados não realizando item drops devidamente após atualização recente no sistema de loot.
|
||||
Corrigido quest de proteger hog (explorers) "completando" mesmo embora o jogador tenha tentado sair da instância ao conversar com o NPC.
|
||||
Corrigido possível exploit com quest de proteger hog (explorers), onde o jogador poderia vir a tentar novamente a instância após completá-la (resultando em recompensas rápidas).
|
||||
Corrigido script de Papulatus não levando os métodos de checagem de requisitos atualizados para expedições.
|
||||
Corrigido diversos scripts de expedições finalizando expedições indevidamente ao realizar operações de party.
|
||||
Implementado checagem por flag de FieldLimit que evita penalidade de perda de EXP em certas áreas do jogo.
|
||||
Revisado limite de dano aplicável por alguns summons, cujo valor limite estava muito abaixo do esperado, levando a problemas com aplicação de ataques dos mesmos.
|
||||
|
||||
15 Julho 2019,
|
||||
Implementado normalização de fuso horário em pacotes enviados ao cliente. Agora o sistema utiliza mesmo fuso horário definido nas flags do servidor.
|
||||
Corrigido certos casos onde grupos dentro de lobby de CPQ não conseguiam ser desafiados, geralmente ocorrendo ao se desconectar após o desafio ter sido aceito e antes de começar a instância.
|
||||
Revisado script de créditos.
|
||||
Adicionado checagem por GM's no método de autoban de jogador.
|
||||
|
||||
17 Julho 2019,
|
||||
Corrigido drops de reatores não utilizando o sistema de drops sequenciais.
|
||||
Revisado uso de sincronizações em vários métodos do sistema, tais como nos métodos de colocação de novos itens no mapa, detecção de toque em reatores, tabela de convidados em casamento, aplicação de dano de jogadores em mobs, recepção de pacotes.
|
||||
|
||||
18 Julho 2019,
|
||||
Corrigido aplicação indevida de requisição de palavra-chave que prosseguia quest em uma das quests na questline de Aran.
|
||||
Corrigido nome errado em coluna da tabela "reports".
|
||||
Corrigido uso de NPC default na conversa padrão que ocorre ao se utilizar o comando "startquest" e "completequest".
|
||||
|
||||
19 Julho 2019,
|
||||
Corrigido quest onde mobs podem aparecer na área do NPC Grendel permitindo repetir os ganhos de quest tanto quanto respawn de mobs à vontade.
|
||||
Corrigido robes de sauna e outros, que permitem ganhos bônus de HP, gerando ganhos 10x maiores que o esperado.
|
||||
Ajustado limites para recuperação de HP de forma a permitir ganhos em vários casos onde há a aplicação de bônus, tais como usando sauna robe, Endure skill.
|
||||
|
||||
22 Julho 2019,
|
||||
Corrigido atributo de contagem de dano em mob aliado da HenesysPQ não instanciado.
|
||||
Corrigido skill "Combat Step" sendo considerado um "buff" pelo sistema do servidor. Isso implicava em duplicação de efeito visual para outros jogadores.
|
||||
|
||||
26 - 27 Julho 2019,
|
||||
Corrigido problemas de cast de tipos que passou a ocorrer após trocar para Java 8.
|
||||
Ajustado flag que permite jogadores a ganhar EXP de mob independente de diferenças de nível.
|
||||
Corrigido Gaviota não sumindo após lançar ataque.
|
||||
Corrigido funcionalidade de ignorar items de pets não se mantendo após trocar de mapas.
|
||||
Corrigido CPQ1 campo 3 e 4 não permitindo jogadores a usar summons/protectors em campo.
|
||||
Corrigido líderes de expedição recebendo pacote de timer para fase de registro em casos onde a expedição falhou em ser iniciada.
|
||||
Corrigido problema de locking ocorrendo recentemente ao tentar rodar limpeza de itens no mapa (ocorre ao realizar drops de vários itens, mais antigos imediatamente sumindo), problema ocorrendo devido a um caso de loop infinito.
|
||||
Corrigido várias skills de summons não utilizando o ícone de buff no canto superior direito da tela.
|
||||
Corrigido alguns danos de summons sendo calculados extremamente baixos quando o jogador não equipa uma arma ou o mesmo não possui pelo menos uma dezena em ataque.
|
||||
|
||||
28 Julho 2019,
|
||||
Corrigido funcionalidade de loot explosivo de mobs não aplicando devidamente.
|
||||
Corrigido linguagens, bastante usado na MCPQ, não utilizando o valor requisitado pelo jogador ao logar/trocar de canais.
|
||||
Corrigido casos de NPE ao tentar realizar updates de posição lado-servidor em alguns summons de jogador.
|
||||
Revisado reset de reatores em reatores que estão desaparecidos por um tempo, para retornar de imediato.
|
||||
|
||||
31 Julho 2019,
|
||||
Revisado AP inicial de jogadores, agora mantendo dois sistemas para suprir a falta de 9 AP's. Ambos com AP's começando em 4/4/4/4: 0AP inicialmente, com ganhos de 4AP na primeira mudança de classe e 5AP na segunda mudança. Se não estiver usando esse método, jogadores possuem de início 9 AP's à disposição.
|
||||
|
||||
02 Agosto 2019,
|
||||
Refatorado vários scripts de quests, não mais realizando disposes e envio de caixas de texto no mesmo status.
|
||||
|
||||
05 Agosto 2019,
|
||||
Revisado casos onde o sistema de recompensas de quests avisa "inventário cheio" mesmo embora novos espaços pudessem ser encontrados na retirada de itens.
|
||||
Corrigido posicionamento não-verificado de lojas criadas por jogadores.
|
||||
Corrigido ganho reduzido de EXP ao utilizar skill Mortal Blow.
|
||||
Corrigido clique em "O" na UI de recepção de itens pelo Duey não realizando ação alguma.
|
||||
Corrigido representação de "quick" na lista de pacotes recebidos pelo Duey não constando os pacotes enviados sem mensagem escrita.
|
||||
Revisado certos casos onde itens enviados com "quick delivery" não conseguiam ser recebidos imediatamente.
|
||||
|
||||
06 Agosto 2019,
|
||||
Corrigido certas montarias não-ligadas a itens de inventário não atuando devidamente ao transicionar mapas (terceiros não conseguiam visualizar a montaria).
|
||||
Revisado os vários scripts de quests anteriormente refatorado. Adição: último if status sinalizando disposes de caixas de texto nos penúltimos status.
|
||||
|
||||
08 - 10 Agosto 2019,
|
||||
Adicionado handler para aplicação de dano em mobs por objetos de ambiente.
|
||||
Revisado uso de Steal ao aplicar dano, preenchendo lista (e buscando evitar novas aplicações) assim que utilizado.
|
||||
Setado checagem para limites de lobbyid ao se iniciar uma instância de evento.
|
||||
Revisado boss logs somente removendo os itens da tabela a partir de um dia antes, não todas as entradas, assim que a tarefa de reset é iniciada.
|
||||
Refatorado elementos não-condizentes com o padrão de design Factory na classe geradora de mapas.
|
||||
Revisado possível cenário de vazamento de memória ocorrido devido a exceção lançada em algum trecho entre removeKilledMonsterObject e dispatchMonsterKilled.
|
||||
Aprimorado loots de reatores, agora colocando loots visíveis ao jogador no centro, similarmente a como loots de mobs ocorrem.
|
||||
Ajustado frequência de loots de reatores para 200ms.
|
||||
|
||||
12 - 14 Agosto 2019,
|
||||
Refatorado vários casos de erros em acessos a funções estáticas a partir de scripts, que passou a ocorrer após trocar de versão Java.
|
||||
Corrigido listas que mantém conteúdo dos mundos e canais esvaziando antes que os processos em execução do TimerManager terminem de executar, no momento do sinal de shutdown do servidor.
|
||||
Revisado update de quests para o jogador durante script de quests, problema permite movimento enquanto o mesmo ainda está falando com o NPC.
|
||||
Revisado novamente os scripts de quest! Problema detectado envolvia incidências de iniciar e completar de quests com disposes na mesma estrutura status.
|
||||
|
||||
19 - 20 Agosto 2019,
|
||||
Revisado autocommit antes da hora e falta de chamada a rollbacks quando ocorre exceção no método de salvar jogador na DB.
|
||||
Corrigido quest scripts recém-formatados pelo caso dos updates de quest durante conversação com NPCs.
|
||||
Revisado cálculo de perda de EXP em nocaute.
|
||||
Corrigido caso de deadlock relacionado a party HP e manutenção de doors, ocorrendo devido a uso indevido de statLock antes de prtLock.
|
||||
|
||||
22 - 23 Agosto 2019,
|
||||
Revisado envio sequencial de pacotes pelo IoSession acoplado à conexão com o cliente.
|
||||
Corrigido possibilidade de uso de SP Reset para aumentar skills imprevistas.
|
||||
Adicionado permissão de drops de NX utilizando a mesma flag dos shops.
|
||||
Adicionado comando para setar quantidade de slots em todos os inventários.
|
||||
|
||||
24 Agosto 2019,
|
||||
Refatorado objeto de MapleStorage, agora sendo gerado um objeto por conta, acoplado ao mundo que jogador pertence (não mais acoplado diretamente com objeto do jogador, jogador agora recebe uma visão deste objeto).
|
||||
|
||||
26 - 27 Agosto 2019,
|
||||
Revisado uso de objeto de jogador pelo MaplePartyCharacter, retirando acesso ao mesmo quando o jogador está desconectado (assim limpando retenção de múltiplos objetos de jogador offline, quando os mesmos se encontram em party).
|
||||
Corrigido casos inesperados como Nimble Feet seguido de Morph fazendo o segundo atuar inesperadamente, aplicando outras imagens de morphs.
|
||||
Corrigido buffs importantes para mecânicas do jogo sendo sobrescritas por possuir menores ganhos que outros.
|
||||
Revisado diversos casos no código-fonte onde havia possibilidade de acesso ao objeto de jogador nulo a partir do MaplePartyCharacter (quando o jogador se encontra offline e está na party).
|
||||
Corrigido caso de EXP ganho ocorrendo menor que o esperado, ao se usar diversos modificadores de ganhos.
|
||||
Corrigido bug crítico na atualização recente relacionado a skill mounts, onde na inicialização dos mounts informações estariam sendo perdidas inesperadamente...
|
||||
Corrigido informações de mount não sendo atualizado para o jogador assim que o mesmo loga, levando a certas quests com requerimento de mount não permitindo inicialização pelo lado-cliente.
|
||||
Revisado sistema criado para manutenção de pacotes enviados através do IoSession, tal sistema agora atuando como uma "pool" ao invés de uma "factory".
|
||||
|
||||
29 Agosto 2019,
|
||||
Revisado uso de loop em espera ocupada no sistema de manutenção de pacotes enviados. Em geral, threads que solicitam anúncio de pacotes não necessitam evitar esperar até que cada pacote seja enviado.
|
||||
|
||||
30 Agosto 2019,
|
||||
Corrigido skill Seal não atuando devidamente para Blaze Wizard.
|
||||
Corrigido skill Seal atuando em bosses.
|
||||
Refatorado funções ainda utilizando invocável desabstraindo o mesmo, assim evitando múltiplos casts de tipo ao decorrer da busca pelo motor de scripts.
|
||||
|
||||
02 - 03 Setembro 2019,
|
||||
Revisado pontos de spawn usados em warps em vários scripts do servidor.
|
||||
Refatorado métodos da CPQ buscando jogadores pelo storage de canais. Não deveria mais haver necessidade já que a partir de uma atualização recente membros offline contém objeto de jogador nulo, e ao reentrar o MPC já assume o novo objeto de jogador.
|
||||
|
||||
05 - 06 Setembro 2019,
|
||||
Adicionado doors em mapas de cidade como objetos visíveis em campo.
|
||||
Corrigido aplicação de status de mobs, onde em várias ocasiões os mobs poderiam parecer inafetáveis aos mesmos.
|
||||
|
||||
07 Setembro 2019,
|
||||
Corrigido jogador não recebendo informações de debuffs em outros jogadores ao trocar de mapas.
|
||||
|
||||
10 - 12 Setembro 2019,
|
||||
Corrigido algumas skills de tipo "mágico", que não usam cargas, não mostrando dano para outros jogadores quando golpe ocorre suficientemente perto.
|
||||
Adicionado checagem por evidência de disponibilidade de scripts em quests.
|
||||
Corrigido inscrição de itens no MTS levando a certos atributos de itens sendo perdidos no processo.
|
||||
Adicionado ganho de MaxHP extra da skill para Thunderbreakers, em ambos casos de aumento de nível e de MaxHP usando AP.
|
||||
Refatorado ação de autopots, permitindo o mesmo a agir imediatamente após detecção de perda suficiente de HP/MP ao usar itens ou skills.
|
||||
Adicionado efeito sonoro de portal ao atravessar Mystic Door.
|
||||
|
||||
16 Setembro 2019,
|
||||
Adicionado checagem no uso de autopots ao usar HP/MP, limites são calculados baseado em estimativa detectada de uso dos autopots pelo lado cliente.
|
||||
|
||||
20 Setembro 2019,
|
||||
Adicionado update de macros ao usar SP reset.
|
||||
Refatorado vários pacotes Java contendo classes diversificadas.
|
||||
Corrigido nomenclatura errônea de "worker" introduzida, querendo significar "task".
|
||||
|
||||
21 - 24 Setembro 2019,
|
||||
Corrigido ferramenta detectora de métodos estáticos não realizando varredura completa em arquivos, parando em casos onde um método estático é encontrado em cada.
|
||||
Implementado ferramenta detectora de scripts de quest que estiveram sendo usados como paliativo.
|
||||
Refatorado amplamente métodos que lidam com atribuição de progresso de quests.
|
||||
Revisado uso de vários scripts de quest que estiveram sendo usados como paliativo.
|
||||
Alterado declaração de "MapleCharacter c", considerado ambíguo à de MapleClient.
|
||||
Revisado uso de progresso de quests feito pelos scripts, de forma a parear com o novo modelo.
|
||||
|
||||
26 - 28 Setembro 2019,
|
||||
Corrigido casos no novo modelo onde algumas quests utilizando informações de progresso não conseguiriam ser completadas.
|
||||
Corrigido uso envio desnecessário de pacote ao atualizar progresso de quest causando popup inesperado de mensagens de quests para jogadores.
|
||||
Corrigido alguns scripts não levando a atualização dos endereços dos pacotes alterados na última refatoração.
|
||||
Corrigido script de quest de Magatia checando errado quantidade de livros adquiridos pelo jogador no progresso de quest.
|
||||
|
||||
29 Setembro 2019,
|
||||
Revisado Raise UI, agora utilizando o novo sistema de progressão.
|
||||
Corrigido checagem por espaço no inventário, ao tentar ganhar itens via quest, não informando o jogador adequadamente sobre itens one-of-a-kind.
|
||||
Corrigido uso de itens na Raise UI, quando não atualizando progresso algum (nenhum pacote enviado ao jogador), não permitindo jogador acesso a certos recursos (como Cash Shop/MTS).
|
||||
Revisado aplicação geral do novo modelo de progressão de quests implementado.
|
||||
|
||||
01 - 02 Outubro 2019,
|
||||
Corrigido caso de exceção de modificação concorrente dentro de módulo de incremento de progresso de mob em quests.
|
||||
Corrigido caixa de diálogo com conteúdo extra, ao terminar uma quest, não sendo enviada ao jogador.
|
||||
Corrigido retransmissão de pacotes de movimentos com sequência vazia crashando outros jogadores.
|
||||
Refatorado checagem por pacotes de movimentos com sequência vazia, agora atuando no módulo abstrato.
|
||||
Corrigido progresso de mobs em quests não atualizando o infoex devidamente ao jogador, levando à falta do balão de "quest completa".
|
||||
Corrigido quest de 1o job de Cygnus permitindo retornar para estado que tenta concluir quest, permitindo assim múltiplas instâncias de conclusão da mesma.
|
||||
Adicionado scripting atuante ao abrir Raise UI, permitindo assim utilizar ações elaboradas, tais como EXP de combate para Mimiana.
|
||||
Corrigido pets não sendo despawnados assim que se dá o tempo de expiração.
|
||||
Corrigido jogadores com "hide" controlando mobs em certas situações.
|
||||
Corrigido análise de alerta de HP/MP lado-servidor não contando com os atributos de HP/MP de equipamentos e buffs.
|
||||
|
||||
03 Outubro 2019,
|
||||
Corrigido skill "Energy Charge" levando atualização de buff ao tocar em mobs, levando a casos onde o buff nos stats poderia inesperadamente ficar retido além do tempo de atuação previsto.
|
||||
Substituído utilização de "Jackson annotations + SnakeYaml" por "YamlBeans", utilizando-se assim menos artefatos JARs no processo (anteriormente 5, agora somente 1). Nota: na transição, fora constatado que a utilização da tecnologia anterior era mais permissiva perante o arquivo de configurações, porém estrutura do novo arquivo foi normalizado e está agora funcional.
|
||||
Refatorado inicialização de eventos ao iniciar o servidor, em busca de melhorar o tempo de startup.
|
||||
|
||||
05 - 08 Outubro 2019,
|
||||
Refatorado os diversos schedulers que estavam presentes na classe de canais, agora abstraídas e atuando dentro de serviços.
|
||||
Corrigido circunstância onde movimentos de mobs poderiam estar sendo processados enquanto jogador está transitando mapas, levando a possível inconsistência na aplicação de movimento do mob na área acessada.
|
||||
|
||||
10 - 12 Outubro 2019,
|
||||
Modificado uso de "default" de petid nos itens de inventário armazenados na DB (de -1 para nulo), assim permitindo criar chaves únicas.
|
||||
Adicionado uso de chaves estrangeiras para o petid.
|
||||
Implementado código de suporte para cupons de "associação" de cosméticos de cabelo.
|
||||
Corrigido bug recente em bosses com atributo "link" sem HPbar sendo detectados como possuindo HPbar, se o mob base possui.
|
||||
Corrigido bug recente na skill "Body Pressure" não aplicando a sua passiva com chance de neutralizar ao tocar mobs.
|
||||
Corrigido quest com NPC "Shaman Rock" aplicando progresso que não corresponde com o esperado (progresso extra agora movido para um novo questid).
|
||||
Adicionado método que permite executar scripts de mapa no sistema de scripts de portal.
|
||||
Corrigido problema recente ao referenciar script com progresso "Touch the Sky" (script de portal utilizando métodos de scripts de mapa).
|
||||
Adicionado fallback para scripts de NPC MapleTV.
|
||||
Revisado aplicação e abordagem deste código-base nos arquivos XML legado.
|
||||
|
||||
15 - 16 Outubro 2019,
|
||||
Corrigido caso inconsistente onde objeto de jogador seria mantido no storage de jogadores caso o jogador tentasse se deregistrar de um canal (sem desconectar) e não mais retornando na mesma sessão.
|
||||
Adicionado código para funcionalidade de "Safety Charm", que permite jogadores curar 30% MaxHP/MaxMP ao retornar em campo.
|
||||
Implementado extensão das facilidades de serviços, agora atuando desjuntamente de canais.
|
||||
Implementado serviço de mundo para salvar jogadores, assim evitando geração de novas threads para cada jogador que está sendo persistido na DB.
|
||||
|
||||
18 Outubro 2019,
|
||||
Revisado abordagem de inicialização de scripts de eventos em canais. Usuários não são mais bloqueados ao tentar logar devido ao canal não ter todos os eventos carregados.
|
||||
|
||||
19 Outubro 2019,
|
||||
Corrigido certos itens de quest não aparecendo de mobs em casos onde o mesmo não é requisito para iniciar/completar.
|
||||
Corrigido NPC Pi crashando jogadores ao tentar criar flechas.
|
||||
Corrigido script de reevolução de pets não atuando em pet Robos, além de agora evitar repetir pets na conversão.
|
||||
|
||||
21 - 22 Outubro 2019,
|
||||
Corrigido boss HPbar não desaparecendo em certos cenários. O mesmo deveria ocorrer assim que mob é retirado do mapa.
|
||||
Revisado informações de mob, que não são propagáveis, sendo repassados à definição do novo mob.
|
||||
Revisado carregamento de storages ao inicializar informações de conta podendo retornar nulo indevidamente em caso de exceção lançada.
|
||||
Corrigido dois casos de deadlock ocorrendo ao tentar cancelar efeito de stat de jogador.
|
||||
Adicionado auditoria de locks para os componentes que travam para leitura e escrita.
|
||||
Adicionado clip de introdução de Cygnus.
|
||||
Revisado updateBuffEffect, agora checando por determinados buffs de pirata e usando pacotes específicos para os mesmos.
|
||||
Revisado geração desnecessária de objetos de mapa ao carregar nomes para comando "goto".
|
||||
Corrigido buffs de mob em fakes desaparecendo assim que o mesmo muda de estado para real.
|
||||
|
||||
24 Outubro 2019,
|
||||
Revisado uso de scriptids na geração de PlayerNPCs. Agora somente ids existentes na base especificada vai adiante.
|
||||
|
||||
27 Outubro 2019,
|
||||
Revisado lógica booleana na detecção de foothold abaixo, não realizando múltiplas checagens sobre um mesmo atributo.
|
||||
|
||||
28 Outubro 2019,
|
||||
Revisado lógica recente de uso de petid único levando a lançamento de exceção (transações de DB implica retirada de item de pet do CS storage na DB antes de colocar o mesmo no inventário).
|
||||
Corrigido portal relacionado a quest em Ariant inesperadamente levando jogadores à passagem secreta de Sleepywood, em caso de conclusão de questline da mesma.
|
||||
Corrigido loop em scripts de quest de associação a Alcadno/Zenumist em Magatia.
|
||||
Adicionado utilização de dispose em quest scripts para o comando homônimo.
|
||||
|
||||
30 Outubro 2019,
|
||||
Corrigido bug em scripts (que possivelmente passou a ocorrer ao utilizar Java8) relacionado ao tentar utilizar métodos da biblioteca Math sem corresponder parâmetros com a assinatura adequada.
|
||||
Corrigido entrega de itemid inesperado em script relacionado a EllinPQ.
|
||||
|
||||
01 - 03 Novembro 2019,
|
||||
Corrigido deslize recente em na funcionalidade de recuperação de itens de quest.
|
||||
Adicionado custom npc para MapleTVs: geradora de scrolls, provê os mesmos após trocar diversos itens ganhos durante jogo.
|
||||
|
||||
04 Novembro 2019,
|
||||
Revisado diversos fluxos de aquisição de locks ao longo das classes mais relevantes do código-fonte.
|
||||
Corrigido problema inesperado com funcionalidade restoreLostItem.
|
||||
Inserido remoção de cash item para dentro da cláusula que checa item no inventário.
|
||||
Corrigido bug em pet autopot retirando quantidades negativas do inventário.
|
||||
Corrigido caso de deadlock em tentativa de aquisição de lock inesperada após adquirir os de mapas, que deveriam ter prioridade baixa.
|
||||
|
||||
07 Novembro 2019,
|
||||
Adicionado cura de debuffs zumbificação e confusão na lista de debuffs a serem curados pela poção "cura-tudo".
|
||||
Corrigido duplicação em mensagem de pós-quest enviada, em casos onde há a presença de ação que automatiza mensagem guiando jogador para a próxima quest.
|
||||
|
||||
09 - 10 Novembro 2019,
|
||||
Refatorado certos usos de finalização não-sucedida de quests, que poderiam compartilhar das mecânicas de desistência de quest.
|
||||
Revisado aquisição de endereço remoto para checagem de transição de jogadores e multi-cliente, agora também avaliando distinção de HWID passado.
|
||||
Corrigido pós-quests ainda permitindo jogadores a movimentarem enquanto a mensagem está na tela, devido a certo conflito com envio de recompensas permitindo movimentação do jogador.
|
||||
Corrigido informação de skillbooks por quests não-funcional após refatoração recente.
|
||||
Corrigido chance de drop de item de quest em El Nath extremamente baixa.
|
||||
|
||||
11 - 12 Novembro 2019,
|
||||
Corrigido algumas skills de ataque de Aran (double, triple swing) não aplicando consumo de MP devidamente.
|
||||
Revisado caso com doors levando jogadores a solo abaixo inesperadamente.
|
||||
Corrigido pots em MCPQ não atuando devidamente para outros jogadores no grupo ou somente para si.
|
||||
Corrigido buffs random em MCPQ acertando sempre múltiplos jogadores.
|
||||
Corrigido poção "cura-tudo" em MCPQ: pots pequenos curando todos os jogadores de party, pots grandes não curando slow.
|
||||
Corrigido caso inesperado em 2nd job de pirata bloqueando saída de jogadores do mapa enquanto não lidarem com todos os mobs.
|
||||
|
||||
13 Novembro 2019,
|
||||
Corrigido problema no sistema de matching ao tentar rodar ações externas enquanto travando os recursos do sistema, ao criar match.
|
||||
Corrigido caso onde novos jogadores poderiam ser agregados à party e entrar em campo na MCPQ assim que confirmação de partida e contagem de início fossem efetivados.
|
||||
Adicionado cache para requerimento de scrolls, assim melhorando tempo de resposta para o novo custom NPC de geração de scrolls.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
@echo off
|
||||
@title HeavenMS
|
||||
set PATH=C:\Program Files\Java\jdk1.7.0_79\bin;%PATH%
|
||||
set PATH=C:\Program Files\Java\jdk1.8.0_211\bin;%PATH%
|
||||
set CLASSPATH=.;dist\*
|
||||
java -Xmx2048m -Dwzpath=wz\ net.server.Server
|
||||
pause
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/sh
|
||||
export CLASSPATH=".:dist/*"
|
||||
java -Xmx2048m -Dwzpath=wz/ net.server.Server
|
||||
4
linux-compile.sh
Executable file
4
linux-compile.sh
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
# thanks to lkxyyjx
|
||||
sudo ant -Dplatforms.JDK_1.7.home=/opt/jdk1.7.0_80 compile
|
||||
sudo ant -Dplatforms.JDK_1.7.home=/opt/jdk1.7.0_80 jar
|
||||
4
linux-launch.sh
Normal file
4
linux-launch.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
# cores in classpath, thanks to lkxyyjx
|
||||
export CLASSPATH=".:dist/*:cores/*"
|
||||
java -Xmx2048m -Dwzpath=wz/ net.server.Server
|
||||
@@ -46,51 +46,15 @@ is divided into following sections:
|
||||
<property file="${user.properties.file}"/>
|
||||
<!-- The two properties below are usually overridden -->
|
||||
<!-- by the active platform. Just a fallback. -->
|
||||
<property name="default.javac.source" value="1.4"/>
|
||||
<property name="default.javac.target" value="1.4"/>
|
||||
<property name="default.javac.source" value="1.6"/>
|
||||
<property name="default.javac.target" value="1.6"/>
|
||||
</target>
|
||||
<target depends="-pre-init,-init-private,-init-user" name="-init-project">
|
||||
<property file="nbproject/configs/${config}.properties"/>
|
||||
<property file="nbproject/project.properties"/>
|
||||
</target>
|
||||
<target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
|
||||
<j2seproject1:property name="platform.home" value="platforms.${platform.active}.home"/>
|
||||
<j2seproject1:property name="platform.bootcp" value="platforms.${platform.active}.bootclasspath"/>
|
||||
<j2seproject1:property name="platform.compiler" value="platforms.${platform.active}.compile"/>
|
||||
<j2seproject1:property name="platform.javac.tmp" value="platforms.${platform.active}.javac"/>
|
||||
<condition property="platform.javac" value="${platform.home}/bin/javac">
|
||||
<equals arg1="${platform.javac.tmp}" arg2="$${platforms.${platform.active}.javac}"/>
|
||||
</condition>
|
||||
<property name="platform.javac" value="${platform.javac.tmp}"/>
|
||||
<j2seproject1:property name="platform.java.tmp" value="platforms.${platform.active}.java"/>
|
||||
<condition property="platform.java" value="${platform.home}/bin/java">
|
||||
<equals arg1="${platform.java.tmp}" arg2="$${platforms.${platform.active}.java}"/>
|
||||
</condition>
|
||||
<property name="platform.java" value="${platform.java.tmp}"/>
|
||||
<j2seproject1:property name="platform.javadoc.tmp" value="platforms.${platform.active}.javadoc"/>
|
||||
<condition property="platform.javadoc" value="${platform.home}/bin/javadoc">
|
||||
<equals arg1="${platform.javadoc.tmp}" arg2="$${platforms.${platform.active}.javadoc}"/>
|
||||
</condition>
|
||||
<property name="platform.javadoc" value="${platform.javadoc.tmp}"/>
|
||||
<condition property="platform.invalid" value="true">
|
||||
<or>
|
||||
<contains string="${platform.javac}" substring="$${platforms."/>
|
||||
<contains string="${platform.java}" substring="$${platforms."/>
|
||||
<contains string="${platform.javadoc}" substring="$${platforms."/>
|
||||
</or>
|
||||
</condition>
|
||||
<fail unless="platform.home">Must set platform.home</fail>
|
||||
<fail unless="platform.bootcp">Must set platform.bootcp</fail>
|
||||
<fail unless="platform.java">Must set platform.java</fail>
|
||||
<fail unless="platform.javac">Must set platform.javac</fail>
|
||||
<fail if="platform.invalid">
|
||||
The J2SE Platform is not correctly set up.
|
||||
Your active platform is: ${platform.active}, but the corresponding property "platforms.${platform.active}.home" is not found in the project's properties files.
|
||||
Either open the project in the IDE and setup the Platform with the same name or add it manually.
|
||||
For example like this:
|
||||
ant -Duser.properties.file=<path_to_property_file> jar (where you put the property "platforms.${platform.active}.home" in a .properties file)
|
||||
or ant -Dplatforms.${platform.active}.home=<path_to_JDK_home> jar (where no properties file is used)
|
||||
</fail>
|
||||
<property name="platform.java" value="${java.home}/bin/java"/>
|
||||
<available file="${manifest.file}" property="manifest.available"/>
|
||||
<condition property="splashscreen.available">
|
||||
<and>
|
||||
@@ -112,7 +76,7 @@ is divided into following sections:
|
||||
<and>
|
||||
<isset property="javac.profile"/>
|
||||
<length length="0" string="${javac.profile}" when="greater"/>
|
||||
<matches pattern="1\.[89](\..*)?" string="${javac.source}"/>
|
||||
<matches pattern="((1\.[89])|9)(\..*)?" string="${javac.source}"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="do.archive">
|
||||
@@ -190,6 +154,7 @@ is divided into following sections:
|
||||
<property name="application.args" value=""/>
|
||||
<property name="source.encoding" value="${file.encoding}"/>
|
||||
<property name="runtime.encoding" value="${source.encoding}"/>
|
||||
<property name="manifest.encoding" value="${source.encoding}"/>
|
||||
<condition property="javadoc.encoding.used" value="${javadoc.encoding}">
|
||||
<and>
|
||||
<isset property="javadoc.encoding"/>
|
||||
@@ -217,6 +182,20 @@ is divided into following sections:
|
||||
<condition else="" property="javac.profile.cmd.line.arg" value="-profile ${javac.profile}">
|
||||
<isset property="profile.available"/>
|
||||
</condition>
|
||||
<condition else="false" property="jdkBug6558476">
|
||||
<and>
|
||||
<matches pattern="1\.[56]" string="${java.specification.version}"/>
|
||||
<not>
|
||||
<os family="unix"/>
|
||||
</not>
|
||||
</and>
|
||||
</condition>
|
||||
<condition else="false" property="javac.fork">
|
||||
<or>
|
||||
<istrue value="${jdkBug6558476}"/>
|
||||
<istrue value="${javac.external.vm}"/>
|
||||
</or>
|
||||
</condition>
|
||||
<property name="jar.index" value="false"/>
|
||||
<property name="jar.index.metainf" value="${jar.index}"/>
|
||||
<property name="copylibs.rebase" value="true"/>
|
||||
@@ -242,6 +221,7 @@ is divided into following sections:
|
||||
<condition else="" property="testng.debug.mode" value="-mixed">
|
||||
<istrue value="${junit+testng.available}"/>
|
||||
</condition>
|
||||
<property name="java.failonerror" value="true"/>
|
||||
</target>
|
||||
<target name="-post-init">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
@@ -284,7 +264,7 @@ is divided into following sections:
|
||||
<property location="${build.dir}/empty" name="empty.dir"/>
|
||||
<mkdir dir="${empty.dir}"/>
|
||||
<mkdir dir="@{apgeneratedsrcdir}"/>
|
||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
|
||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
|
||||
<src>
|
||||
<dirset dir="@{gensrcdir}" erroronmissingdir="false">
|
||||
<include name="*"/>
|
||||
@@ -324,7 +304,7 @@ is divided into following sections:
|
||||
<sequential>
|
||||
<property location="${build.dir}/empty" name="empty.dir"/>
|
||||
<mkdir dir="${empty.dir}"/>
|
||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
|
||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
|
||||
<src>
|
||||
<dirset dir="@{gensrcdir}" erroronmissingdir="false">
|
||||
<include name="*"/>
|
||||
@@ -405,7 +385,7 @@ is divided into following sections:
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<property name="junit.forkmode" value="perTest"/>
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
|
||||
<test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="test-sys-prop."/>
|
||||
@@ -428,7 +408,7 @@ is divided into following sections:
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<property name="junit.forkmode" value="perTest"/>
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
|
||||
<batchtest todir="${build.test.results.dir}">
|
||||
<fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
|
||||
<filename name="${test.binarytestincludes}"/>
|
||||
@@ -460,7 +440,7 @@ is divided into following sections:
|
||||
</condition>
|
||||
<union id="test.set"/>
|
||||
<taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
|
||||
<testng classfilesetref="test.set" failureProperty="tests.failed" jvm="${platform.java}" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="HeavenMS" testname="TestNG tests" workingDir="${work.dir}">
|
||||
<testng classfilesetref="test.set" failureProperty="tests.failed" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="HeavenMS" testname="TestNG tests" workingDir="${work.dir}">
|
||||
<xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
|
||||
<propertyset>
|
||||
<propertyref prefix="test-sys-prop."/>
|
||||
@@ -540,7 +520,7 @@ is divided into following sections:
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<property name="junit.forkmode" value="perTest"/>
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
|
||||
<test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="test-sys-prop."/>
|
||||
@@ -565,7 +545,7 @@ is divided into following sections:
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<property name="junit.forkmode" value="perTest"/>
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
|
||||
<batchtest todir="${build.test.results.dir}">
|
||||
<fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
|
||||
<filename name="${test.binarytestincludes}"/>
|
||||
@@ -707,7 +687,7 @@ is divided into following sections:
|
||||
<sequential>
|
||||
<property environment="env"/>
|
||||
<resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
|
||||
<java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
|
||||
<java classname="@{classname}" dir="${profiler.info.dir}" failonerror="${java.failonerror}" fork="true" jvm="${profiler.info.jvm}">
|
||||
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
|
||||
<jvmarg value="${profiler.info.jvmargs.agent}"/>
|
||||
<jvmarg line="${profiler.info.jvmargs}"/>
|
||||
@@ -742,9 +722,6 @@ is divided into following sections:
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
<bootclasspath>
|
||||
<path path="${platform.bootcp}"/>
|
||||
</bootclasspath>
|
||||
</nbjpdastart>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
@@ -760,9 +737,7 @@ is divided into following sections:
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-debug-args">
|
||||
<exec executable="${platform.java}" outputproperty="version-output">
|
||||
<arg value="-version"/>
|
||||
</exec>
|
||||
<property name="version-output" value="java version "${ant.java.version}"/>
|
||||
<condition property="have-jdk-older-than-1.4">
|
||||
<or>
|
||||
<contains string="${version-output}" substring="java version "1.0"/>
|
||||
@@ -787,7 +762,7 @@ is divided into following sections:
|
||||
<attribute default="${debug.classpath}" name="classpath"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<java classname="@{classname}" dir="${work.dir}" fork="true" jvm="${platform.java}">
|
||||
<java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
|
||||
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
|
||||
<jvmarg line="${debug-args-line}"/>
|
||||
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
|
||||
@@ -814,7 +789,7 @@ is divided into following sections:
|
||||
<attribute default="jvm" name="jvm"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<java classname="@{classname}" dir="${work.dir}" fork="true" jvm="${platform.java}">
|
||||
<java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
|
||||
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
|
||||
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
|
||||
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
|
||||
@@ -853,7 +828,7 @@ is divided into following sections:
|
||||
</chainedmapper>
|
||||
</pathconvert>
|
||||
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
|
||||
<copylibs compress="${jar.compress}" excludeFromCopy="${copylibs.excludes}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
|
||||
<copylibs compress="${jar.compress}" excludeFromCopy="${copylibs.excludes}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" manifestencoding="UTF-8" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
|
||||
<fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
|
||||
<manifest>
|
||||
<attribute name="Class-Path" value="${jar.classpath}"/>
|
||||
@@ -865,7 +840,7 @@ is divided into following sections:
|
||||
</target>
|
||||
<target name="-init-presetdef-jar">
|
||||
<presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
|
||||
<jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifestencoding="UTF-8">
|
||||
<j2seproject1:fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
|
||||
</jar>
|
||||
</presetdef>
|
||||
@@ -988,15 +963,15 @@ is divided into following sections:
|
||||
</target>
|
||||
<target depends="init" if="do.archive+manifest.available" name="-do-jar-copy-manifest">
|
||||
<tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
|
||||
<copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
|
||||
<copy encoding="${manifest.encoding}" file="${manifest.file}" outputencoding="UTF-8" tofile="${tmp.manifest.file}"/>
|
||||
</target>
|
||||
<target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+main.class.available" name="-do-jar-set-mainclass">
|
||||
<manifest file="${tmp.manifest.file}" mode="update">
|
||||
<manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update">
|
||||
<attribute name="Main-Class" value="${main.class}"/>
|
||||
</manifest>
|
||||
</target>
|
||||
<target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+profile.available" name="-do-jar-set-profile">
|
||||
<manifest file="${tmp.manifest.file}" mode="update">
|
||||
<manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update">
|
||||
<attribute name="Profile" value="${javac.profile}"/>
|
||||
</manifest>
|
||||
</target>
|
||||
@@ -1004,7 +979,7 @@ is divided into following sections:
|
||||
<basename file="${application.splash}" property="splashscreen.basename"/>
|
||||
<mkdir dir="${build.classes.dir}/META-INF"/>
|
||||
<copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
|
||||
<manifest file="${tmp.manifest.file}" mode="update">
|
||||
<manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update">
|
||||
<attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
|
||||
</manifest>
|
||||
</target>
|
||||
@@ -1012,7 +987,7 @@ is divided into following sections:
|
||||
<j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
|
||||
<echo level="info">To run this application from the command line without Ant, try:</echo>
|
||||
<property location="${dist.jar}" name="dist.jar.resolved"/>
|
||||
<echo level="info">${platform.java} -jar "${dist.jar.resolved}"</echo>
|
||||
<echo level="info">java -jar "${dist.jar.resolved}"</echo>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.archive" name="-do-jar-jar" unless="do.mkdist">
|
||||
<j2seproject1:jar manifest="${tmp.manifest.file}"/>
|
||||
@@ -1199,7 +1174,7 @@ is divided into following sections:
|
||||
<target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main">
|
||||
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
||||
<startprofiler/>
|
||||
<antcal target="run-test-with-main"/>
|
||||
<antcall target="run-test-with-main"/>
|
||||
</target>
|
||||
<target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
@@ -1221,13 +1196,10 @@ is divided into following sections:
|
||||
</not>
|
||||
</and>
|
||||
</condition>
|
||||
<exec executable="${platform.java}" failonerror="false" outputproperty="platform.version.output">
|
||||
<arg value="-version"/>
|
||||
</exec>
|
||||
<condition else="" property="bug5101868workaround" value="*.java">
|
||||
<matches multiline="true" pattern="1\.[56](\..*)?" string="${platform.version.output}"/>
|
||||
<matches pattern="1\.[56](\..*)?" string="${java.version}"/>
|
||||
</condition>
|
||||
<javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" executable="${platform.javadoc}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
|
||||
<javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
|
||||
<classpath>
|
||||
<path path="${javac.classpath}"/>
|
||||
</classpath>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
build.xml.data.CRC32=92113194
|
||||
build.xml.data.CRC32=92efccf9
|
||||
build.xml.script.CRC32=ff13faf5
|
||||
build.xml.stylesheet.CRC32=8064a381@1.75.2.48
|
||||
build.xml.stylesheet.CRC32=8064a381@1.80.1.48
|
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||
nbproject/build-impl.xml.data.CRC32=92113194
|
||||
nbproject/build-impl.xml.script.CRC32=cef58264
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.75.2.48
|
||||
nbproject/build-impl.xml.data.CRC32=92efccf9
|
||||
nbproject/build-impl.xml.script.CRC32=8cda444e
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48
|
||||
|
||||
@@ -3,4 +3,4 @@ do.depend=false
|
||||
do.jar=true
|
||||
javac.debug=true
|
||||
javadoc.preview=true
|
||||
user.properties.file=C:\\Users\\RonanLana\\AppData\\Roaming\\NetBeans\\8.0.2\\build.properties
|
||||
user.properties.file=C:\\Users\\RonanLana\\AppData\\Roaming\\NetBeans\\8.2\\build.properties
|
||||
|
||||
@@ -34,6 +34,7 @@ file.reference.mina-core-2.0.19.jar=cores/mina-core-2.0.19.jar
|
||||
file.reference.mysql-connector-java-bin.jar=cores/mysql-connector-java-bin.jar
|
||||
file.reference.slf4j-api-1.7.21.jar=cores/slf4j-api-1.7.21.jar
|
||||
file.reference.slf4j-jdk14-1.7.5.jar=cores/slf4j-jdk14-1.7.5.jar
|
||||
file.reference.yamlbeans-1.13.jar=cores/yamlbeans-1.13.jar
|
||||
includes=**
|
||||
jar.archive.disabled=${jnlp.enabled}
|
||||
jar.compress=true
|
||||
@@ -43,14 +44,16 @@ javac.classpath=\
|
||||
${file.reference.slf4j-api-1.7.21.jar}:\
|
||||
${file.reference.HikariCP-java7-2.4.13.jar}:\
|
||||
${file.reference.mysql-connector-java-bin.jar}:\
|
||||
${file.reference.slf4j-jdk14-1.7.5.jar}
|
||||
${file.reference.slf4j-jdk14-1.7.5.jar}:\
|
||||
${file.reference.yamlbeans-1.13.jar}
|
||||
# Space-separated list of extra javac options
|
||||
javac.compilerargs=
|
||||
javac.deprecation=false
|
||||
javac.external.vm=false
|
||||
javac.processorpath=\
|
||||
${javac.classpath}
|
||||
javac.source=1.7
|
||||
javac.target=1.7
|
||||
javac.source=1.8
|
||||
javac.target=1.8
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
@@ -84,7 +87,7 @@ manifest.custom.permissions=
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
mkdist.disabled=false
|
||||
platform.active=JDK_1.7
|
||||
platform.active=default_platform
|
||||
project.license=gpl30_msv2
|
||||
project.licensePath=./nbproject/licenseheader.txt
|
||||
run.classpath=\
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>HeavenMS</name>
|
||||
<explicit-platform explicit-source-supported="true"/>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
|
||||
@@ -31,7 +31,7 @@ var maxMapId = 108010101;
|
||||
|
||||
var eventTime = 20; //20 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -31,7 +31,7 @@ var maxMapId = 108010201;
|
||||
|
||||
var eventTime = 20; //20 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -33,7 +33,7 @@ var eventMaps = [923010000];
|
||||
|
||||
var eventTime = 5; //5 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -31,7 +31,7 @@ var maxMapId = 108010501;
|
||||
|
||||
var eventTime = 20; //20 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -31,7 +31,7 @@ var maxMapId = 108010401;
|
||||
|
||||
var eventTime = 20; //20 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -31,7 +31,7 @@ var maxMapId = 108010301;
|
||||
|
||||
var eventTime = 20; //20 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -30,7 +30,7 @@ var maxMapId = 912020000;
|
||||
|
||||
var eventTime = 2; //2 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -1,185 +0,0 @@
|
||||
/*
|
||||
This file is part of the OdinMS Maple Story Server
|
||||
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
|
||||
Matthias Butz <matze@odinms.de>
|
||||
Jan Christian Meyer <vimes@odinms.de>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation version 3 as published by
|
||||
the Free Software Foundation. You may not use, modify or distribute
|
||||
this program under any other version of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
var exitMap;
|
||||
var minPlayers = 3;
|
||||
|
||||
function init() {}
|
||||
|
||||
function monsterValue(eim, mobId) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
function setup(level, lobbyid) {
|
||||
exitMap = em.getChannelServer().getMapFactory().getMap(105090800); // <exit>
|
||||
|
||||
var eim = em.newInstance("4jberserk_" + lobbyid);
|
||||
eim.setProperty("level", level);
|
||||
|
||||
var mf = eim.getMapFactory();
|
||||
|
||||
var map = mf.getMap(910500200);
|
||||
map.addMapTimer(3*60);
|
||||
em.schedule("timeOut", 20 * 60000);
|
||||
|
||||
//you can't warp up to the rocks until all rogs are dead, I think?
|
||||
eim.setProperty("canWarp","false");
|
||||
|
||||
return eim;
|
||||
}
|
||||
|
||||
function afterSetup(eim) {}
|
||||
|
||||
function playerEntry(eim, player) {
|
||||
var map = eim.getMapInstance(910500200);
|
||||
player.changeMap(map, map.getPortal(0));
|
||||
|
||||
//TODO: hold time across map changes
|
||||
//player.getClient().announce(tools.MaplePacketCreator.getClock(1800));
|
||||
}
|
||||
|
||||
function playerDead(eim, player) {
|
||||
}
|
||||
|
||||
function playerRevive(eim, player) {
|
||||
//if (eim.isLeader(player)) { //check for party leader
|
||||
//boot whole party and end
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim, party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
/*/}
|
||||
else { //boot dead player
|
||||
// If only 2 players are left, uncompletable:
|
||||
var party = eim.getPlayers();
|
||||
if (party.size() <= minPlayers) {
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim,party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
else
|
||||
playerExit(eim, player);
|
||||
}*/
|
||||
}
|
||||
|
||||
function playerDisconnected(eim, player) {
|
||||
//if (eim.isLeader(player)) { //check for party leader
|
||||
//boot whole party and end
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
if (party.get(i).equals(player)) {
|
||||
removePlayer(eim, player);
|
||||
}
|
||||
else {
|
||||
playerExit(eim, party.get(i));
|
||||
}
|
||||
}
|
||||
eim.dispose();
|
||||
/*/}
|
||||
else { //boot d/ced player
|
||||
// If only 2 players are left, uncompletable:
|
||||
var party = eim.getPlayers();
|
||||
if (party.size() < minPlayers) {
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim,party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
else
|
||||
playerExit(eim, player);
|
||||
}*/
|
||||
}
|
||||
|
||||
function leftParty(eim, player) {
|
||||
// If only 2 players are left, uncompletable:
|
||||
var party = eim.getPlayers();
|
||||
if (true) {
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim,party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
else
|
||||
playerExit(eim, player);
|
||||
}
|
||||
|
||||
function disbandParty(eim) {
|
||||
//boot whole party and end
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim, party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function playerUnregistered(eim, player) {}
|
||||
|
||||
function playerExit(eim, player) {
|
||||
eim.unregisterPlayer(player);
|
||||
player.changeMap(exitMap, exitMap.getPortal(0));
|
||||
}
|
||||
|
||||
//for offline players
|
||||
function removePlayer(eim, player) {
|
||||
eim.unregisterPlayer(player);
|
||||
player.getMap().removePlayer(player);
|
||||
player.setMap(exitMap);
|
||||
}
|
||||
|
||||
function clearPQ(eim) {
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++)
|
||||
playerExit(eim, party.get(i));
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function monsterKilled(mob, eim) {}
|
||||
|
||||
function allMonstersDead(eim) {
|
||||
eim.setProperty("canWarp","true");
|
||||
}
|
||||
|
||||
function cancelSchedule() {}
|
||||
|
||||
function timeOut() {
|
||||
var iter = em.getInstances().iterator();
|
||||
while (iter.hasNext()) {
|
||||
var eim = iter.next();
|
||||
if (eim.getPlayerCount() > 0) {
|
||||
var pIter = eim.getPlayers().iterator();
|
||||
while (pIter.hasNext())
|
||||
playerExit(eim, pIter.next());
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ---------- FILLER FUNCTIONS ----------
|
||||
|
||||
function dispose() {}
|
||||
|
||||
function scheduledTimeout(eim) {}
|
||||
|
||||
function changedLeader(eim, leader) {}
|
||||
|
||||
@@ -1,155 +0,0 @@
|
||||
/*
|
||||
This file is part of the OdinMS Maple Story Server
|
||||
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
|
||||
Matthias Butz <matze@odinms.de>
|
||||
Jan Christian Meyer <vimes@odinms.de>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation version 3 as published by
|
||||
the Free Software Foundation. You may not use, modify or distribute
|
||||
this program under any other version of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/*
|
||||
* @author AngelSL
|
||||
*
|
||||
* 4th Job Rush Quest.
|
||||
* Based on Kerning City PQ script by Stereo
|
||||
*/
|
||||
|
||||
var exitMap;
|
||||
var minPlayers = 3;
|
||||
|
||||
function init() {}
|
||||
|
||||
function monsterValue(eim, mobId) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
function setup(level, lobbyid) {
|
||||
exitMap = em.getChannelServer().getMapFactory().getMap(105090700); // <exit>
|
||||
|
||||
var eim = em.newInstance("4jrush_" + lobbyid);
|
||||
eim.setProperty("level", level);
|
||||
|
||||
var mf = eim.getMapFactory();
|
||||
var map = mf.getMap(910500100);
|
||||
map.addMapTimer(20*60);
|
||||
em.schedule("timeOut", 20 * 60000);
|
||||
return eim;
|
||||
}
|
||||
|
||||
function afterSetup(eim) {}
|
||||
|
||||
function playerEntry(eim, player) {
|
||||
var map = eim.getMapInstance(910500100);
|
||||
player.changeMap(map, map.getPortal(0));
|
||||
}
|
||||
|
||||
function playerDead(eim, player) {
|
||||
}
|
||||
|
||||
function playerRevive(eim, player) {
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim, party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function playerDisconnected(eim, player) {
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
if (party.get(i).equals(player)) {
|
||||
removePlayer(eim, player);
|
||||
}
|
||||
else {
|
||||
playerExit(eim, party.get(i));
|
||||
}
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function leftParty(eim, player) {
|
||||
// If only 2 players are left, uncompletable:
|
||||
var party = eim.getPlayers();
|
||||
if (true) {
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim,party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
else
|
||||
playerExit(eim, player);
|
||||
}
|
||||
|
||||
function disbandParty(eim) {
|
||||
//boot whole party and end
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim, party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function playerUnregistered(eim, player) {}
|
||||
|
||||
function playerExit(eim, player) {
|
||||
eim.unregisterPlayer(player);
|
||||
player.changeMap(exitMap, exitMap.getPortal(0));
|
||||
}
|
||||
|
||||
//for offline players
|
||||
function removePlayer(eim, player) {
|
||||
eim.unregisterPlayer(player);
|
||||
player.getMap().removePlayer(player);
|
||||
player.setMap(exitMap);
|
||||
}
|
||||
|
||||
function clearPQ(eim) {
|
||||
//KPQ does nothing special with winners
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim, party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function monsterKilled(mob, eim) {}
|
||||
|
||||
function allMonstersDead(eim) {}
|
||||
|
||||
function cancelSchedule() {}
|
||||
|
||||
function timeOut() {
|
||||
var iter = em.getInstances().iterator();
|
||||
while (iter.hasNext()) {
|
||||
var eim = iter.next();
|
||||
if (eim.getPlayerCount() > 0) {
|
||||
var pIter = eim.getPlayers().iterator();
|
||||
while (pIter.hasNext()) {
|
||||
playerExit(eim, pIter.next());
|
||||
}
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ---------- FILLER FUNCTIONS ----------
|
||||
|
||||
function dispose() {}
|
||||
|
||||
function scheduledTimeout(eim) {}
|
||||
|
||||
function changedLeader(eim, leader) {}
|
||||
|
||||
@@ -30,7 +30,7 @@ var maxMapId = 912010200;
|
||||
|
||||
var eventTime = 4; //4 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -30,7 +30,7 @@ var maxMapId = 912010200;
|
||||
|
||||
var eventTime = 4; //4 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -31,7 +31,7 @@ var maxMapId = 921110000;
|
||||
|
||||
var eventTime = 3; //3 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -31,7 +31,7 @@ var maxMapId = 914030000;
|
||||
|
||||
var eventTime = 3; //3 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -170,7 +170,7 @@ function playerLeft(eim, player) {
|
||||
|
||||
function changedMap(eim, player, mapid) {
|
||||
if (mapid < minMapId || mapid > maxMapId) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -179,17 +179,12 @@ function changedMap(eim, player, mapid) {
|
||||
}
|
||||
}
|
||||
|
||||
function changedLeader(eim, leader) {
|
||||
var mapid = leader.getMapId();
|
||||
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
|
||||
end(eim);
|
||||
}
|
||||
}
|
||||
function changedLeader(eim, leader) {}
|
||||
|
||||
function playerDead(eim, player) {}
|
||||
|
||||
function playerRevive(eim, player) { // player presses ok on the death pop up.
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -198,7 +193,7 @@ function playerRevive(eim, player) { // player presses ok on the death pop up.
|
||||
}
|
||||
|
||||
function playerDisconnected(eim, player) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -206,19 +201,9 @@ function playerDisconnected(eim, player) {
|
||||
eim.unregisterPlayer(player);
|
||||
}
|
||||
|
||||
function leftParty(eim, player) {
|
||||
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
|
||||
end(eim);
|
||||
}
|
||||
else
|
||||
playerLeft(eim, player);
|
||||
}
|
||||
function leftParty(eim, player) {}
|
||||
|
||||
function disbandParty(eim) {
|
||||
if (!eim.isEventCleared()) {
|
||||
end(eim);
|
||||
}
|
||||
}
|
||||
function disbandParty(eim) {}
|
||||
|
||||
function monsterValue(eim, mobId) {
|
||||
return 1;
|
||||
@@ -259,7 +244,8 @@ function monsterKilled(mob, eim) {
|
||||
eim.showClearEffect();
|
||||
eim.clearPQ();
|
||||
|
||||
eim.dispatchUpdateQuestMobCount(bossMobId, entryMap);
|
||||
eim.dispatchRaiseQuestMobCount(bossMobId, entryMap);
|
||||
eim.dispatchRaiseQuestMobCount(9101003, entryMap); // thanks Atoot for noticing quest not getting updated after boss kill
|
||||
mob.getMap().broadcastBalrogVictory(eim.getLeader().getName());
|
||||
} else {
|
||||
if(count == 1) {
|
||||
|
||||
@@ -170,7 +170,7 @@ function playerLeft(eim, player) {
|
||||
|
||||
function changedMap(eim, player, mapid) {
|
||||
if (mapid < minMapId || mapid > maxMapId) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -179,17 +179,12 @@ function changedMap(eim, player, mapid) {
|
||||
}
|
||||
}
|
||||
|
||||
function changedLeader(eim, leader) {
|
||||
var mapid = leader.getMapId();
|
||||
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
|
||||
end(eim);
|
||||
}
|
||||
}
|
||||
function changedLeader(eim, leader) {}
|
||||
|
||||
function playerDead(eim, player) {}
|
||||
|
||||
function playerRevive(eim, player) { // player presses ok on the death pop up.
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -198,7 +193,7 @@ function playerRevive(eim, player) { // player presses ok on the death pop up.
|
||||
}
|
||||
|
||||
function playerDisconnected(eim, player) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -206,19 +201,9 @@ function playerDisconnected(eim, player) {
|
||||
eim.unregisterPlayer(player);
|
||||
}
|
||||
|
||||
function leftParty(eim, player) {
|
||||
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
|
||||
end(eim);
|
||||
}
|
||||
else
|
||||
playerLeft(eim, player);
|
||||
}
|
||||
function leftParty(eim, player) {}
|
||||
|
||||
function disbandParty(eim) {
|
||||
if (!eim.isEventCleared()) {
|
||||
end(eim);
|
||||
}
|
||||
}
|
||||
function disbandParty(eim) {}
|
||||
|
||||
function monsterValue(eim, mobId) {
|
||||
return 1;
|
||||
@@ -259,7 +244,7 @@ function monsterKilled(mob, eim) {
|
||||
eim.showClearEffect();
|
||||
eim.clearPQ();
|
||||
|
||||
eim.dispatchUpdateQuestMobCount(bossMobId, entryMap);
|
||||
eim.dispatchRaiseQuestMobCount(bossMobId, entryMap);
|
||||
mob.getMap().broadcastBalrogVictory(eim.getLeader().getName());
|
||||
} else {
|
||||
if(count == 1) {
|
||||
|
||||
@@ -31,7 +31,7 @@ var maxMapId = 910520000;
|
||||
|
||||
var eventTime = 10; //10 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
|
||||
@@ -241,7 +241,7 @@ function scheduledTimeout(eim) {
|
||||
|
||||
function changedMap(eim, player, mapid) {
|
||||
if (mapid < minMapId || mapid > maxMapId) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.dropMessage(5, "[Expedition] Either the leader has quit the expedition or there is no longer the minimum number of members required to continue it.");
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
@@ -297,7 +297,7 @@ function changedLeader(eim, leader) {}
|
||||
function playerDead(eim, player) {}
|
||||
|
||||
function playerRevive(eim, player) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
eim.dropMessage(5, "[Expedition] Either the leader has quit the expedition or there is no longer the minimum number of members required to continue it.");
|
||||
end(eim);
|
||||
@@ -309,7 +309,7 @@ function playerRevive(eim, player) {
|
||||
}
|
||||
|
||||
function playerDisconnected(eim, player) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.dropMessage(5, "[Expedition] Either the leader has quit the expedition or there is no longer the minimum number of members required to continue it.");
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
|
||||
@@ -35,7 +35,7 @@ var maxMapId = 925010300;
|
||||
|
||||
var eventTime = 6; // 6 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function init() {
|
||||
setEventRequirements();
|
||||
|
||||
@@ -36,7 +36,7 @@ var maxMapId = 922020100;
|
||||
|
||||
var eventTime = 20; // 20 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function init() {
|
||||
setEventRequirements();
|
||||
|
||||
@@ -24,7 +24,7 @@ function respawn(eim){}
|
||||
|
||||
function playerEntry(eim, player){
|
||||
var cave = eim.getMapInstance(eventMap + 10 * eim.getIntProperty("nex"));
|
||||
player.changeMap(cave);
|
||||
player.changeMap(cave, 1);
|
||||
}
|
||||
|
||||
function scheduledTimeout(eim){
|
||||
|
||||
@@ -105,6 +105,8 @@ function setup(level, lobbyid) {
|
||||
var eim = em.newInstance("Henesys" + lobbyid);
|
||||
eim.setProperty("level", level);
|
||||
eim.setProperty("stage", "0");
|
||||
eim.setProperty("bunnyCake", "0");
|
||||
eim.setProperty("bunnyDamaged", "0");
|
||||
|
||||
eim.getInstanceMap(910010000).resetPQ(level);
|
||||
eim.getInstanceMap(910010000).allowSummonState(false);
|
||||
@@ -243,6 +245,25 @@ function friendlyKilled(mob, eim) {
|
||||
}
|
||||
}
|
||||
|
||||
function friendlyItemDrop(eim, mob) {
|
||||
if (mob.getId() == 9300061) {
|
||||
var cakes = eim.getIntProperty("bunnyCake") + 1;
|
||||
eim.setIntProperty("bunnyCake", cakes);
|
||||
|
||||
mob.getMap().broadcastMessage(Packages.tools.MaplePacketCreator.serverNotice(6, "The Moon Bunny made rice cake number " + cakes + "."));
|
||||
}
|
||||
}
|
||||
|
||||
function friendlyDamaged(eim, mob) {
|
||||
if (mob.getId() == 9300061) {
|
||||
var bunnyDamage = eim.getIntProperty("bunnyDamaged") + 1;
|
||||
if (bunnyDamage > 5) {
|
||||
broadcastMessage(Packages.tools.MaplePacketCreator.serverNotice(6, "The Moon Bunny is feeling sick. Please protect it so it can make delicious rice cakes."));
|
||||
eim.setIntProperty("bunnyDamaged", 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function allMonstersDead(eim) {}
|
||||
|
||||
function cancelSchedule() {}
|
||||
|
||||
@@ -214,7 +214,7 @@ function monsterKilled(mob, eim) {
|
||||
eim.showClearEffect(mob.getMap().getId());
|
||||
eim.clearPQ();
|
||||
|
||||
eim.dispatchUpdateQuestMobCount(8810018, 240060200);
|
||||
eim.dispatchRaiseQuestMobCount(8810018, 240060200);
|
||||
mob.getMap().broadcastHorntailVictory();
|
||||
} else if(isHorntailHead(mob)) {
|
||||
var killed = eim.getIntProperty("defeatedHead");
|
||||
|
||||
@@ -52,7 +52,7 @@ function primeMinisterCheck(eim) {
|
||||
var pIter = map.getAllPlayers().iterator();
|
||||
while (pIter.hasNext()) {
|
||||
var player = pIter.next();
|
||||
if (player.getQuestStatus(2333) == 1 && player.getAbstractPlayerInteraction().getQuestProgress(2333, mobId) == 0) {
|
||||
if (player.getQuestStatus(2333) == 1 && player.getAbstractPlayerInteraction().getQuestProgressInt(2333, mobId) == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ var maxMapId = 914020000;
|
||||
|
||||
var eventTime = 10; // 10 minutes
|
||||
|
||||
var lobbyRange = [0, 0];
|
||||
var lobbyRange = [0, 7];
|
||||
|
||||
function init() {}
|
||||
|
||||
|
||||
@@ -115,7 +115,9 @@ function setup(level, lobbyid) {
|
||||
return eim;
|
||||
}
|
||||
|
||||
function afterSetup(eim) {}
|
||||
function afterSetup(eim) {
|
||||
updateGateState(1);
|
||||
}
|
||||
|
||||
function respawnStages(eim) {}
|
||||
|
||||
@@ -143,7 +145,7 @@ function playerLeft(eim, player) {
|
||||
|
||||
function changedMap(eim, player, mapid) {
|
||||
if (mapid < minMapId || mapid > maxMapId) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -152,17 +154,12 @@ function changedMap(eim, player, mapid) {
|
||||
}
|
||||
}
|
||||
|
||||
function changedLeader(eim, leader) {
|
||||
var mapid = leader.getMapId();
|
||||
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
|
||||
end(eim);
|
||||
}
|
||||
}
|
||||
function changedLeader(eim, leader) {}
|
||||
|
||||
function playerDead(eim, player) {}
|
||||
|
||||
function playerRevive(eim, player) { // player presses ok on the death pop up.
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -171,7 +168,7 @@ function playerRevive(eim, player) { // player presses ok on the death pop up.
|
||||
}
|
||||
|
||||
function playerDisconnected(eim, player) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
@@ -179,19 +176,9 @@ function playerDisconnected(eim, player) {
|
||||
eim.unregisterPlayer(player);
|
||||
}
|
||||
|
||||
function leftParty(eim, player) {
|
||||
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
|
||||
end(eim);
|
||||
}
|
||||
else
|
||||
playerLeft(eim, player);
|
||||
}
|
||||
function leftParty(eim, player) {}
|
||||
|
||||
function disbandParty(eim) {
|
||||
if (!eim.isEventCleared()) {
|
||||
end(eim);
|
||||
}
|
||||
}
|
||||
function disbandParty(eim) {}
|
||||
|
||||
function monsterValue(eim, mobId) {
|
||||
return 1;
|
||||
@@ -213,6 +200,7 @@ function giveRandomEventReward(eim, player) {
|
||||
function clearPQ(eim) {
|
||||
eim.stopEventTimer();
|
||||
eim.setEventCleared();
|
||||
updateGateState(0);
|
||||
}
|
||||
|
||||
function isPapulatus(mob) {
|
||||
@@ -231,5 +219,14 @@ function allMonstersDead(eim) {}
|
||||
|
||||
function cancelSchedule() {}
|
||||
|
||||
function dispose(eim) {}
|
||||
function updateGateState(newState) { // thanks Conrad for noticing missing gate update
|
||||
em.getChannelServer().getMapFactory().getMap(220080000).getReactorById(2208001).forceHitReactor(newState);
|
||||
em.getChannelServer().getMapFactory().getMap(220080000).getReactorById(2208002).forceHitReactor(newState);
|
||||
em.getChannelServer().getMapFactory().getMap(220080000).getReactorById(2208003).forceHitReactor(newState);
|
||||
}
|
||||
|
||||
function dispose(eim) {
|
||||
if (!eim.isEventCleared()) {
|
||||
updateGateState(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ function respawn(eim){}
|
||||
|
||||
function playerEntry(eim, player){
|
||||
var cave = eim.getMapInstance(eventMap);
|
||||
player.changeMap(cave);
|
||||
player.changeMap(cave, 1);
|
||||
}
|
||||
|
||||
function scheduledTimeout(eim){
|
||||
|
||||
211
scripts/event/RescueGaga.js
Normal file
211
scripts/event/RescueGaga.js
Normal file
@@ -0,0 +1,211 @@
|
||||
/**
|
||||
* @author: kevintjuh93
|
||||
* @author: Ronan
|
||||
*/
|
||||
|
||||
importPackage(Packages.tools);
|
||||
|
||||
var isPq = true;
|
||||
var minPlayers = 1, maxPlayers = 1;
|
||||
var minLevel = 12, maxLevel = 255;
|
||||
var entryMap = 922240000;
|
||||
var exitMap = 922240200;
|
||||
var recruitMap = 922240200;
|
||||
|
||||
var minMapId = 922240000;
|
||||
var maxMapId = 922240100;
|
||||
|
||||
var eventTime = 3; // 3 minutes
|
||||
|
||||
var lobbyRange = [0, 19];
|
||||
|
||||
function init() {
|
||||
setEventRequirements();
|
||||
}
|
||||
|
||||
function setLobbyRange() {
|
||||
return lobbyRange;
|
||||
}
|
||||
|
||||
function setEventRequirements() {
|
||||
var reqStr = "";
|
||||
|
||||
reqStr += "\r\n Number of players: ";
|
||||
if(maxPlayers - minPlayers >= 1) reqStr += minPlayers + " ~ " + maxPlayers;
|
||||
else reqStr += minPlayers;
|
||||
|
||||
reqStr += "\r\n Level range: ";
|
||||
if(maxLevel - minLevel >= 1) reqStr += minLevel + " ~ " + maxLevel;
|
||||
else reqStr += minLevel;
|
||||
|
||||
reqStr += "\r\n Time limit: ";
|
||||
reqStr += eventTime + " minutes";
|
||||
|
||||
em.setProperty("party", reqStr);
|
||||
}
|
||||
|
||||
function setEventExclusives(eim) {
|
||||
var itemSet = [];
|
||||
eim.setExclusiveItems(itemSet);
|
||||
}
|
||||
|
||||
function setEventRewards(eim) {
|
||||
var itemSet, itemQty, evLevel, expStages;
|
||||
|
||||
evLevel = 1; //Rewards at clear PQ
|
||||
itemSet = [];
|
||||
itemQty = [];
|
||||
eim.setEventRewards(evLevel, itemSet, itemQty);
|
||||
|
||||
expStages = []; //bonus exp given on CLEAR stage signal
|
||||
eim.setEventClearStageExp(expStages);
|
||||
}
|
||||
|
||||
function getEligibleParty(party) { //selects, from the given party, the team that is allowed to attempt this event
|
||||
var eligible = [];
|
||||
var hasLeader = false;
|
||||
|
||||
if(party.size() > 0) {
|
||||
var partyList = party.toArray();
|
||||
|
||||
for(var i = 0; i < party.size(); i++) {
|
||||
var ch = partyList[i];
|
||||
|
||||
if(ch.getMapId() == recruitMap && ch.getLevel() >= minLevel && ch.getLevel() <= maxLevel) {
|
||||
if(ch.isLeader()) hasLeader = true;
|
||||
eligible.push(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!(hasLeader && eligible.length >= minPlayers && eligible.length <= maxPlayers)) eligible = [];
|
||||
return eligible;
|
||||
}
|
||||
|
||||
function setup(level, lobbyid) {
|
||||
var eim = em.newInstance("RescueGaga_" + lobbyid);
|
||||
eim.setProperty("level", level);
|
||||
eim.setProperty("stage", "0");
|
||||
eim.setProperty("falls", "0");
|
||||
|
||||
respawnStages(eim);
|
||||
eim.startEventTimer(eventTime * 60000);
|
||||
setEventRewards(eim);
|
||||
setEventExclusives(eim);
|
||||
return eim;
|
||||
}
|
||||
|
||||
function afterSetup(eim) {}
|
||||
|
||||
function respawnStages(eim) {}
|
||||
|
||||
function playerEntry(eim, player) {
|
||||
var map = eim.getMapInstance(entryMap);
|
||||
player.changeMap(map, map.getPortal(0));
|
||||
|
||||
player.announce(MaplePacketCreator.showEffect("event/space/start"));
|
||||
player.startMapEffect("Please rescue Gaga within the time limit.", 5120027);
|
||||
}
|
||||
|
||||
function scheduledTimeout(eim) {
|
||||
end(eim);
|
||||
}
|
||||
|
||||
function playerUnregistered(eim, player) {}
|
||||
|
||||
function playerExit(eim, player) {
|
||||
eim.unregisterPlayer(player);
|
||||
player.changeMap(exitMap, 0);
|
||||
}
|
||||
|
||||
function changedMap(eim, player, mapid) {
|
||||
if (mapid < minMapId || mapid > maxMapId) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
|
||||
player.changeMap(mapid, 0);
|
||||
player.cancelEffect(2360002);
|
||||
|
||||
end(eim);
|
||||
} else {
|
||||
eim.unregisterPlayer(player);
|
||||
|
||||
player.changeMap(mapid, 0);
|
||||
player.cancelEffect(2360002);
|
||||
}
|
||||
} else if (mapid == maxMapId) {
|
||||
eim.clearPQ();
|
||||
|
||||
var rgaga = player.getEvents().get("rescueGaga");
|
||||
rgaga.complete();
|
||||
}
|
||||
}
|
||||
|
||||
function afterChangedMap(eim, player, mapid) {
|
||||
if (mapid == minMapId) {
|
||||
player.getAbstractPlayerInteraction().useItem(2360002);//HOORAY <3
|
||||
} else {
|
||||
player.cancelEffect(2360002);
|
||||
}
|
||||
}
|
||||
|
||||
function changedLeader(eim, leader) {}
|
||||
|
||||
function playerDead(eim, player) {}
|
||||
|
||||
function playerRevive(eim, player) { // player presses ok on the death pop up.
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
else
|
||||
eim.unregisterPlayer(player);
|
||||
}
|
||||
|
||||
function playerDisconnected(eim, player) {
|
||||
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
|
||||
eim.unregisterPlayer(player);
|
||||
end(eim);
|
||||
}
|
||||
else
|
||||
eim.unregisterPlayer(player);
|
||||
}
|
||||
|
||||
function leftParty(eim, player) {}
|
||||
|
||||
function disbandParty(eim) {}
|
||||
|
||||
function monsterValue(eim, mobId) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
function end(eim) {
|
||||
var party = eim.getPlayers();
|
||||
for (var i = 0; i < party.size(); i++) {
|
||||
playerExit(eim, party.get(i));
|
||||
}
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function giveRandomEventReward(eim, player) {
|
||||
eim.giveEventReward(player);
|
||||
}
|
||||
|
||||
function clearPQ(eim) {
|
||||
eim.stopEventTimer();
|
||||
eim.setEventCleared();
|
||||
|
||||
eim.schedule("spawnGrandpaBunny", 10 * 1000);
|
||||
}
|
||||
|
||||
function spawnGrandpaBunny(eim) {
|
||||
eim.spawnNpc(9001105, new java.awt.Point(175, -20), eim.getInstanceMap(maxMapId));
|
||||
}
|
||||
|
||||
function monsterKilled(mob, eim) {}
|
||||
|
||||
function allMonstersDead(eim) {}
|
||||
|
||||
function cancelSchedule() {}
|
||||
|
||||
function dispose(eim) {}
|
||||
@@ -63,7 +63,7 @@ function respawn(eim) {
|
||||
|
||||
function playerEntry(eim, player) {
|
||||
var amplifierMap = eim.getMapInstance(entryMap.getId());
|
||||
player.changeMap(amplifierMap);
|
||||
player.changeMap(amplifierMap, 1);
|
||||
eim.schedule("timeOut", timer);
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ function respawn(eim) {
|
||||
|
||||
function playerEntry(eim, player) {
|
||||
var amplifierMap = eim.getMapInstance(entryMap.getId());
|
||||
player.changeMap(amplifierMap);
|
||||
player.changeMap(amplifierMap, 1);
|
||||
eim.schedule("timeOut", timer);
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,9 @@ function setEventRewards(eim) {
|
||||
eim.setEventClearStageMeso(mesoStages);
|
||||
}
|
||||
|
||||
function afterSetup(eim) {}
|
||||
function afterSetup(eim) {
|
||||
updateGateState(1);
|
||||
}
|
||||
|
||||
function setup(channel) {
|
||||
var eim = em.newInstance("Zakum" + channel);
|
||||
@@ -188,6 +190,7 @@ function giveRandomEventReward(eim, player) {
|
||||
function clearPQ(eim) {
|
||||
eim.stopEventTimer();
|
||||
eim.setEventCleared();
|
||||
updateGateState(0);
|
||||
}
|
||||
|
||||
function isZakum(mob) {
|
||||
@@ -209,4 +212,12 @@ function allMonstersDead(eim) {}
|
||||
|
||||
function cancelSchedule() {}
|
||||
|
||||
function dispose(eim) {}
|
||||
function updateGateState(newState) { // thanks Conrad for noticing missing gate update
|
||||
em.getChannelServer().getMapFactory().getMap(211042300).getReactorById(2118002).forceHitReactor(newState);
|
||||
}
|
||||
|
||||
function dispose(eim) {
|
||||
if (!eim.isEventCleared()) {
|
||||
updateGateState(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
function start(ms) {
|
||||
ms.getPlayer().resetEnteredScript();
|
||||
ms.getPlayer().getMap().addMapTimer(180);
|
||||
ms.getPlayer().resetEnteredScript();
|
||||
ms.spawnMonster(9300331, -28, 0);
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
This file is part of the OdinMS Maple Story Server
|
||||
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
|
||||
Matthias Butz <matze@odinms.de>
|
||||
Jan Christian Meyer <vimes@odinms.de>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation version 3 as published by
|
||||
the Free Software Foundation. You may not use, modify or distribute
|
||||
this program under any other version of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/*
|
||||
*@Author: kevintjuh93
|
||||
*/
|
||||
|
||||
importPackage(Packages.tools);
|
||||
var player;
|
||||
|
||||
function start(ms) {
|
||||
player = ms.getPlayer();
|
||||
player.resetEnteredScript();
|
||||
ms.getClient().announce(MaplePacketCreator.showEffect("event/space/start"));
|
||||
player.startMapEffect("Please rescue Gaga within the time limit.", 5120027);
|
||||
var map = player.getMap();
|
||||
if (map.getTimeLeft() > 0) {
|
||||
ms.getClient().announce(MaplePacketCreator.getClock(map.getTimeLeft()));
|
||||
} else {
|
||||
map.addMapTimer(180);
|
||||
}
|
||||
ms.useItem(2360002);//HOORAY <3
|
||||
}
|
||||
@@ -21,5 +21,5 @@
|
||||
*/
|
||||
|
||||
function start(ms) {
|
||||
ms.getPlayer().updateQuestInfo(20010, "1");
|
||||
ms.setQuestProgress(20010, 20022, 1);
|
||||
}
|
||||
@@ -21,5 +21,5 @@
|
||||
*/
|
||||
|
||||
function start(ms) {
|
||||
ms.getPlayer().updateQuestInfo(20010, "1");
|
||||
ms.setQuestProgress(20010, 20022, 1);
|
||||
}
|
||||
@@ -5,11 +5,11 @@ function start(ms){
|
||||
var map = player.getMap();
|
||||
|
||||
if(player.isCygnus()) {
|
||||
if(ms.isQuestStarted(20730) && ms.getQuestProgress(20730, 9300285) == 0) {
|
||||
if(ms.isQuestStarted(20730) && ms.getQuestProgressInt(20730, 9300285) == 0) {
|
||||
map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300285), new java.awt.Point(680, 258));
|
||||
}
|
||||
} else {
|
||||
if(ms.isQuestStarted(21731) && ms.getQuestProgress(21731, 9300344) == 0) {
|
||||
if(ms.isQuestStarted(21731) && ms.getQuestProgressInt(21731, 9300344) == 0) {
|
||||
map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300344), new java.awt.Point(680, 258));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,5 +21,5 @@
|
||||
*/
|
||||
|
||||
function start(ms) {
|
||||
ms.getPlayer().updateQuestInfo(21000, "1");
|
||||
ms.setQuestProgress(21000, 21002, 1);
|
||||
}
|
||||
@@ -4,7 +4,7 @@ function start(ms){
|
||||
var player = ms.getPlayer();
|
||||
var map = player.getMap();
|
||||
|
||||
if(ms.isQuestStarted(21747) && ms.getQuestProgress(21747, 9300351) == 0) {
|
||||
if(ms.isQuestStarted(21747) && ms.getQuestProgressInt(21747, 9300351) == 0) {
|
||||
map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300351), new java.awt.Point(897, 51));
|
||||
}
|
||||
}
|
||||
25
scripts/map/onUserEnter/cygnusJobTutorial.js
Normal file
25
scripts/map/onUserEnter/cygnusJobTutorial.js
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
This file is part of the OdinMS Maple Story Server
|
||||
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
|
||||
Matthias Butz <matze@odinms.de>
|
||||
Jan Christian Meyer <vimes@odinms.de>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation version 3 as published by
|
||||
the Free Software Foundation. You may not use, modify or distribute
|
||||
this program under any other version of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
function start(ms) {
|
||||
ms.displayCygnusIntro();
|
||||
}
|
||||
@@ -19,13 +19,11 @@
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package constants.skills;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Author: kevintjuh93
|
||||
*
|
||||
* @author BubblesDev
|
||||
*/
|
||||
public class Swordsman {
|
||||
public static final int IMPROVED_MAX_HP_INCREASE = 1000001;
|
||||
public static final int IRON_BODY = 1000003;
|
||||
}
|
||||
*/
|
||||
function start(ms) {
|
||||
ms.touchTheSky();
|
||||
}
|
||||
5
scripts/map/onUserEnter/startEreb.js
Normal file
5
scripts/map/onUserEnter/startEreb.js
Normal file
@@ -0,0 +1,5 @@
|
||||
function start(ms) {
|
||||
if (ms.getJobId() == 1000 && ms.getLevel() >= 10) {
|
||||
ms.unlockUI();
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ spawnPnpcFee = 7000000;
|
||||
jobType = 3;
|
||||
|
||||
function start() {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
spawnPnpc = true;
|
||||
|
||||
var sendStr = "You have walked a long way to reach the power, wisdom and courage you hold today, haven't you? What do you say about having right now #ra NPC on the Hall of Fame holding the current image of your character#k? Do you like it?";
|
||||
@@ -93,7 +93,7 @@ function action(mode, type, selection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
cm.sendOk("There you go! Hope you will like it.");
|
||||
cm.gainMeso(-spawnPnpcFee);
|
||||
} else {
|
||||
|
||||
@@ -72,7 +72,10 @@ function action(mode, type, selection) {
|
||||
} else if (status == 2){
|
||||
cm.dispose();
|
||||
if (beauty == 1){
|
||||
if (cm.haveItem(5150001)){
|
||||
if (cm.haveItem(5420002)){ // thanks MedicOP for noticing uncoded functionality for Hair Membership coupons
|
||||
cm.setHair(hairnew[selection]);
|
||||
cm.sendOk("Enjoy your new and improved hairstyle!");
|
||||
} else if (cm.haveItem(5150001)){
|
||||
cm.gainItem(5150001, -1);
|
||||
cm.setHair(hairnew[selection]);
|
||||
cm.sendOk("Enjoy your new and improved hairstyle!");
|
||||
|
||||
@@ -35,7 +35,7 @@ spawnPnpcFee = 7000000;
|
||||
jobType = 1;
|
||||
|
||||
function start() {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
spawnPnpc = true;
|
||||
|
||||
var sendStr = "You have walked a long way to reach the power, wisdom and courage you hold today, haven't you? What do you say about having right now #ra NPC on the Hall of Fame holding the current image of your character#k? Do you like it?";
|
||||
@@ -94,7 +94,7 @@ function action(mode, type, selection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
cm.sendOk("There you go! Hope you will like it.");
|
||||
cm.gainMeso(-spawnPnpcFee);
|
||||
} else {
|
||||
|
||||
@@ -35,7 +35,7 @@ spawnPnpcFee = 7000000;
|
||||
jobType = 2;
|
||||
|
||||
function start() {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
spawnPnpc = true;
|
||||
|
||||
var sendStr = "You have walked a long way to reach the power, wisdom and courage you hold today, haven't you? What do you say about having right now #ra NPC on the Hall of Fame holding the current image of your character#k? Do you like it?";
|
||||
@@ -94,7 +94,7 @@ function action(mode, type, selection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
cm.sendOk("There you go! Hope you will like it.");
|
||||
cm.gainMeso(-spawnPnpcFee);
|
||||
} else {
|
||||
|
||||
@@ -9,6 +9,11 @@ var status;
|
||||
var mobId = 2220100; //Blue Mushroom
|
||||
|
||||
function start(){
|
||||
if (!cm.isQuestStarted(20718)) { // thanks Stray, Ari
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
|
||||
status = -1;
|
||||
action(1, 0, 0);
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ spawnPnpcFee = 7000000;
|
||||
jobType = 4;
|
||||
|
||||
function start() {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
spawnPnpc = true;
|
||||
|
||||
var sendStr = "You have walked a long way to reach the power, wisdom and courage you hold today, haven't you? What do you say about having right now #ra NPC on the Hall of Fame holding the current image of your character#k? Do you like it?";
|
||||
@@ -95,7 +95,7 @@ function action(mode, type, selection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
cm.sendOk("There you go! Hope you will like it.");
|
||||
cm.gainMeso(-spawnPnpcFee);
|
||||
} else {
|
||||
|
||||
@@ -66,7 +66,7 @@ function action(mode, type, selection) {
|
||||
ticketSelection = selection;
|
||||
if (ticketSelection > -1) {
|
||||
cm.gainItem(4031035 + ticketSelection, -1);
|
||||
cm.warp(103000897 + (ticketSelection * 3));
|
||||
cm.warp(103000897 + (ticketSelection * 3), "st00"); // thanks IxianMace for noticing a few scripts having misplaced warp SP's
|
||||
hasTicket = false;
|
||||
cm.dispose();
|
||||
return;
|
||||
|
||||
@@ -28,6 +28,6 @@ function start() {
|
||||
cm.gainItem(4031039,1);
|
||||
else
|
||||
cm.gainItem(4020000 + ((Math.random()*5)|0), 1);
|
||||
cm.warp(103000100);
|
||||
cm.warp(103000100, 0);
|
||||
cm.dispose();
|
||||
}
|
||||
@@ -28,6 +28,6 @@ function start() {
|
||||
cm.gainItem(4031040,1);
|
||||
else
|
||||
cm.gainItem(prizes[parseInt(Math.random() * prizes.length)],1);
|
||||
cm.warp(103000100);
|
||||
cm.warp(103000100, 0);
|
||||
cm.dispose();
|
||||
}
|
||||
@@ -28,6 +28,6 @@ function start() {
|
||||
cm.gainItem(4031041,1);
|
||||
else
|
||||
cm.gainItem(prizes[parseInt(Math.random() * prizes.length)],1);
|
||||
cm.warp(103000100);
|
||||
cm.warp(103000100, 0);
|
||||
cm.dispose();
|
||||
}
|
||||
@@ -53,7 +53,7 @@ function action(mode, type, selection) {
|
||||
cm.sendOk("Oh, you don't have the money, right? Sorry, I can't let you in.");
|
||||
} else {
|
||||
cm.gainMeso(-5000);
|
||||
cm.warp(193000000);
|
||||
cm.warp(193000000, "out00");
|
||||
}
|
||||
|
||||
cm.dispose();
|
||||
|
||||
@@ -78,7 +78,10 @@ function action(mode, type, selection) {
|
||||
else if (status == 2){
|
||||
cm.dispose();
|
||||
if (beauty == 1){
|
||||
if (cm.haveItem(5150003)){
|
||||
if (cm.haveItem(5420003)){
|
||||
cm.setHair(hairnew[selection]);
|
||||
cm.sendOk("Enjoy your new and improved hairstyle!");
|
||||
} else if (cm.haveItem(5150003)){
|
||||
cm.gainItem(5150003, -1);
|
||||
cm.setHair(hairnew[selection]);
|
||||
cm.sendOk("Enjoy your new and improved hairstyle!");
|
||||
|
||||
@@ -65,8 +65,13 @@ function action(mode, type, selection) {
|
||||
cm.sendSimple("#e#b<Expedition: " + expedName + ">\r\n#k#n" + em.getProperty("party") + "\r\n\r\nWould you like to assemble a team to take on #r" + expedBoss + "#k?\r\n#b#L1#Lets get this going!#l\r\n\#L2#No, I think I'll wait a bit...#l\r\n\#L3#I would like to see info about this expedition...#l");
|
||||
status = 1;
|
||||
} else if (expedition.isLeader(player)) { //If you're the leader, manage the exped
|
||||
cm.sendSimple(list);
|
||||
status = 2;
|
||||
if (expedition.isInProgress()) {
|
||||
cm.sendOk("Your expedition is already in progress, for those who remain battling lets pray for those brave souls.");
|
||||
cm.dispose();
|
||||
} else {
|
||||
cm.sendSimple(list);
|
||||
status = 2;
|
||||
}
|
||||
} else if (expedition.isRegistering()) { //If the expedition is registering
|
||||
if (expedition.contains(player)) { //If you're in it but it hasn't started, be patient
|
||||
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin it.");
|
||||
@@ -99,8 +104,11 @@ function action(mode, type, selection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cm.createExpedition(exped)) {
|
||||
var res = cm.createExpedition(exped);
|
||||
if (res == 0) {
|
||||
cm.sendOk("The #r" + expedBoss + " Expedition#k has been created.\r\n\r\nTalk to me again to view the current team, or start the fight!");
|
||||
} else if (res > 0) {
|
||||
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
|
||||
} else {
|
||||
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ function action(mode, type, selection) {
|
||||
}
|
||||
} else if(status == 1){
|
||||
if(cm.getEventInstance().isEventCleared()) {
|
||||
cm.warp(cm.getMapId() == 105100300 ? 105100301 : 105100401);
|
||||
cm.warp(cm.getMapId() == 105100300 ? 105100301 : 105100401, 0);
|
||||
} else {
|
||||
cm.warp(105100100);
|
||||
}
|
||||
|
||||
@@ -21,12 +21,15 @@
|
||||
*/
|
||||
var status = -1;
|
||||
|
||||
/*
|
||||
Custom Quest 100300
|
||||
*/
|
||||
function activateShamanRock(slot,progress) {
|
||||
var active = (progress >> slot) % 2;
|
||||
if(!active) {
|
||||
progress |= (1 << slot);
|
||||
var ch = progress[slot];
|
||||
if(ch == '0') {
|
||||
var nextProgress = progress.substr(0, slot) + '1' + progress.substr(slot + 1);
|
||||
|
||||
cm.updateQuest(2236, progress);
|
||||
cm.setQuestProgress(2236, nextProgress);
|
||||
cm.gainItem(4032263, -1);
|
||||
cm.sendOk("The seal took it's place, repelling the evil in the area.");
|
||||
return 1;
|
||||
@@ -45,7 +48,11 @@ function start() {
|
||||
else if(map == 105070000) activateShamanRock(2,progress);
|
||||
|
||||
else if(map == 105090000) { // workaround... TWO SAME NPC ID ON SAME MAP
|
||||
if(!activateShamanRock(3,progress)) {
|
||||
var npcOid = cm.getQuestProgressInt(100300, 1);
|
||||
if (npcOid == 0) {
|
||||
activateShamanRock(3,progress);
|
||||
cm.setQuestProgress(100300, 1, cm.getNpcObjectId());
|
||||
} else if (cm.getNpcObjectId() != npcOid) {
|
||||
activateShamanRock(4,progress);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,12 +21,15 @@
|
||||
*/
|
||||
var status = -1;
|
||||
|
||||
/*
|
||||
Custom Quest 100300
|
||||
*/
|
||||
function activateShamanRock(slot,progress) {
|
||||
var active = (progress >> slot) % 2;
|
||||
if(!active) {
|
||||
progress |= (1 << slot);
|
||||
var ch = progress[slot];
|
||||
if(ch == '0') {
|
||||
var nextProgress = progress.substr(0, slot) + '1' + progress.substr(slot + 1);
|
||||
|
||||
cm.updateQuest(2236, progress);
|
||||
cm.setQuestProgress(2236, nextProgress);
|
||||
cm.gainItem(4032263, -1);
|
||||
cm.sendOk("The seal took it's place, repelling the evil in the area.");
|
||||
return 1;
|
||||
@@ -45,7 +48,11 @@ function start() {
|
||||
else if(map == 105070000) activateShamanRock(2,progress);
|
||||
|
||||
else if(map == 105090000) { // workaround... TWO SAME NPC ID ON SAME MAP
|
||||
if(!activateShamanRock(3,progress)) {
|
||||
var npcOid = cm.getQuestProgressInt(100300, 1);
|
||||
if (npcOid == 0) {
|
||||
activateShamanRock(3,progress);
|
||||
cm.setQuestProgress(100300, 1, cm.getNpcObjectId());
|
||||
} else if (cm.getNpcObjectId() != npcOid) {
|
||||
activateShamanRock(4,progress);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ function action(mode, type, selection) {
|
||||
cm.gainItem(4031010, -1);
|
||||
cm.sendOk("You will have to collect me #b30 #t4031013##k. Good luck.")
|
||||
} else if (status == 4) {
|
||||
cm.warp(108000100);
|
||||
cm.warp(108000100, 0);
|
||||
cm.dispose();
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -5,36 +5,52 @@
|
||||
**/
|
||||
|
||||
var status;
|
||||
|
||||
|
||||
function start() {
|
||||
status = -1;
|
||||
action(1,0,0);
|
||||
action(1, 0, 0);
|
||||
}
|
||||
|
||||
function action(mode,type,selection) {
|
||||
if (status == -1) {
|
||||
if (cm.getMapId() == 108000502) {
|
||||
if (!(cm.haveItem(4031856,15))) {
|
||||
cm.sendNext("Go, and get me 15 #b#t4031856##k.");
|
||||
cm.dispose();
|
||||
} else {
|
||||
status = 2;
|
||||
cm.sendNext("Wow, you have brought me 15 #b#t4031856##k! Congratulations. Let me warp you out now.");
|
||||
}
|
||||
} else if (cm.getMapId() == 108000501) {
|
||||
if (!(cm.haveItem(4031857,15))) {
|
||||
cm.sendNext("Go, and get me 15 #b#t4031857##k.");
|
||||
cm.dispose();
|
||||
} else {
|
||||
status = 2;
|
||||
cm.sendNext("Wow, you have brought me 15 #b#t4031857##k! Congratulations. Let me warp you out now.");
|
||||
}
|
||||
} else {
|
||||
cm.sendNext("Error. Please report this.");
|
||||
cm.dispose();
|
||||
}
|
||||
} else if (status == 2) {
|
||||
cm.warp(120000101,0);
|
||||
cm.dispose();
|
||||
function action(mode, type, selection) {
|
||||
if (mode == -1) {
|
||||
cm.dispose();
|
||||
} else {
|
||||
if (mode == 0 && type > 0) {
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
if (mode == 1)
|
||||
status++;
|
||||
else
|
||||
status--;
|
||||
|
||||
if(status == 0) {
|
||||
if (cm.getMapId() == 108000502) {
|
||||
if (!(cm.haveItem(4031856,15))) {
|
||||
cm.sendSimple("You haven't brought me all the crystals yet. I'm looking forward for your progress, mate! \r\n#b#L1#I would like to leave#l");
|
||||
} else {
|
||||
status++;
|
||||
cm.sendNext("Wow, you have brought me 15 #b#t4031856##k! Congratulations. Let me warp you out now.");
|
||||
}
|
||||
} else if (cm.getMapId() == 108000501) {
|
||||
if (!(cm.haveItem(4031857,15))) {
|
||||
cm.sendSimple("You haven't brought me all the crystals yet. I'm looking forward for your progress, mate! \r\n#b#L1#I would like to leave#l");
|
||||
} else {
|
||||
status++;
|
||||
cm.sendNext("Wow, you have brought me 15 #b#t4031857##k! Congratulations. Let me warp you out now.");
|
||||
}
|
||||
} else {
|
||||
cm.sendNext("Error. Please report this.");
|
||||
cm.dispose();
|
||||
}
|
||||
} else if (status == 1) { // thanks Lame for noticing players getting stuck in area in certain scenarios
|
||||
cm.removeAll(4031856);
|
||||
cm.removeAll(4031857);
|
||||
cm.warp(120000101,0);
|
||||
cm.dispose();
|
||||
} else if (status == 2) {
|
||||
cm.warp(120000101,0);
|
||||
cm.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,8 +39,7 @@ function start() {
|
||||
if (cm.getEventInstance() != null) { // missing script for skill test found thanks to Jade™
|
||||
advQuest = 5; // string visibility thanks to iPunchEm & Glvelturall
|
||||
cm.sendNext("Not bad at all. Let's discuss this outside!");
|
||||
cm.setQuestProgress(6330, 0, 1);
|
||||
} else if (cm.getQuestProgress(6330, 0) == 0) {
|
||||
} else if (cm.getQuestProgressInt(6330, 6331) == 0) {
|
||||
advQuest = 1;
|
||||
cm.sendNext("You're ready, right? Now try to withstand my attacks for 2 minutes. I won't go easy on you. Good luck, because you will need it.");
|
||||
} else {
|
||||
@@ -54,8 +53,7 @@ function start() {
|
||||
if (cm.getEventInstance() != null) {
|
||||
advQuest = 6;
|
||||
cm.sendNext("Not bad at all. Let's discuss this outside!");
|
||||
cm.setQuestProgress(6370, 0, 1);
|
||||
} else if (cm.getQuestProgress(6370, 0) == 0) {
|
||||
} else if (cm.getQuestProgressInt(6370, 6371) == 0) {
|
||||
advQuest = 2;
|
||||
cm.sendNext("You're ready, right? Now try to withstand my attacks for 2 minutes. I won't go easy on you. Good luck, because you will need it.");
|
||||
} else {
|
||||
@@ -65,7 +63,7 @@ function start() {
|
||||
|
||||
cm.sendNext("Congratulations. You have managed to pass my test. I'll teach you a new skill called \"Battleship\".\r\n\r\n #s5221006# #b#q5221006##k");
|
||||
}
|
||||
} else if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
} else if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
spawnPnpc = true;
|
||||
|
||||
var sendStr = "You have walked a long way to reach the power, wisdom and courage you hold today, haven't you? What do you say about having right now #ra NPC on the Hall of Fame holding the current image of your character#k? Do you like it?";
|
||||
@@ -126,6 +124,12 @@ function action(mode, type, selection) {
|
||||
cm.sendOk("Unlike most of the other skills you used as a Pirate, this one definitely is different. You can actually ride the 'Battleship' and attack enemies with it. Your DEF level will increase for the time you're on board, so that'll help you tremendously in combat situations. May you become the best Gunslinger out there...");
|
||||
}
|
||||
} else {
|
||||
if (advQuest < 6) {
|
||||
cm.setQuestProgress(6330, 6331, 2);
|
||||
} else {
|
||||
cm.setQuestProgress(6370, 6371, 2);
|
||||
}
|
||||
|
||||
cm.warp(120000101);
|
||||
}
|
||||
|
||||
@@ -138,7 +142,7 @@ function action(mode, type, selection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
cm.sendOk("There you go! Hope you will like it.");
|
||||
cm.gainMeso(-spawnPnpcFee);
|
||||
} else {
|
||||
@@ -222,7 +226,7 @@ function action(mode, type, selection) {
|
||||
cm.sendOk("All the training maps are currently in use. Please try again later.");
|
||||
cm.dispose();
|
||||
} else {
|
||||
cm.warp(map);
|
||||
cm.warp(map, 0);
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ function action(mode, type, selection) {
|
||||
cm.sendOk("Who are you talking to me? If you're just bored, go bother somebody else.");
|
||||
cm.dispose();
|
||||
} else {
|
||||
seagullProgress = cm.getQuestProgress(6400, 0);
|
||||
seagullProgress = cm.getQuestProgressInt(6400, 1);
|
||||
|
||||
if (seagullProgress == 0) {
|
||||
seagullIdx = Math.floor(Math.random() * seagullQuestion.length);
|
||||
@@ -90,7 +90,7 @@ function action(mode, type, selection) {
|
||||
var answer = cm.getText();
|
||||
if (answer == seagullAnswer[seagullIdx]) {
|
||||
cm.sendNext("What! I can't believe how incredibly smart you are! Incredible! In the seagull world, that kind of intellingence would give you a Ph.D. and then some. You're really amazing... I can't believe it... I simply can't believe it!");
|
||||
cm.setQuestProgress(6400, 0, 1);
|
||||
cm.setQuestProgress(6400, 1, 1);
|
||||
cm.dispose();
|
||||
} else {
|
||||
cm.sendOk("Hmm, that's not quite how I recall it. Try again!");
|
||||
@@ -99,9 +99,11 @@ function action(mode, type, selection) {
|
||||
} else if (seagullProgress != 2) {
|
||||
cm.sendNextPrev("Anyway, only one of 9 Barts is the real Bart. You know that Pirates are known for the strength of their friendships and camaraderie with their fellow pirates. If you're a true pirate, you should be able to find your own mate with ease. Alright then, I'll send you to the room where Bart is.");
|
||||
} else {
|
||||
cm.gainExp(1000000);
|
||||
cm.teachSkill(5221003, 0, 10, -1);
|
||||
cm.forceCompleteQuest(6400);
|
||||
//cm.gainExp(1000000);
|
||||
//cm.teachSkill(5221003, 0, 10, -1);
|
||||
//cm.forceCompleteQuest(6400);
|
||||
|
||||
cm.sendNextPrev("You have met all my challenges, and passed! Good job!");
|
||||
cm.dispose();
|
||||
}
|
||||
} else if (status == 3) {
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
function start() {
|
||||
if(cm.getQuestProgress(2180, 0) == 1) {
|
||||
if(cm.getQuestProgressInt(2180, 1) == 1) {
|
||||
cm.sendNext("You have taken milk from this cow recently, check another cow.");
|
||||
cm.dispose();
|
||||
return;
|
||||
@@ -32,19 +32,19 @@ function start() {
|
||||
cm.gainItem(4031847, -1);
|
||||
cm.gainItem(4031848, 1);
|
||||
|
||||
cm.setQuestProgress(2180, 0, 1);
|
||||
cm.setQuestProgress(2180, 1, 1);
|
||||
} else if (cm.canHold(4031849, 1) && cm.haveItem(4031848)) {
|
||||
cm.sendNext("Now filling up the bottle with milk. The bottle is now 2/3 full of milk.");
|
||||
cm.gainItem(4031848, -1);
|
||||
cm.gainItem(4031849, 1);
|
||||
|
||||
cm.setQuestProgress(2180, 0, 1);
|
||||
cm.setQuestProgress(2180, 1, 1);
|
||||
} else if (cm.canHold(4031850) && cm.haveItem(4031849)) {
|
||||
cm.sendNext("Now filling up the bottle with milk. The bottle is now completely full of milk.");
|
||||
cm.gainItem(4031849, -1);
|
||||
cm.gainItem(4031850, 1);
|
||||
|
||||
cm.setQuestProgress(2180, 0, 1);
|
||||
cm.setQuestProgress(2180, 1, 1);
|
||||
} else {
|
||||
cm.sendNext("Your inventory is full, and there's no room for a milk bottle.");
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
function start() {
|
||||
if(cm.getQuestProgress(2180, 0) == 2) {
|
||||
if(cm.getQuestProgressInt(2180, 1) == 2) {
|
||||
cm.sendNext("You have taken milk from this cow recently, check another cow.");
|
||||
cm.dispose();
|
||||
return;
|
||||
@@ -32,19 +32,19 @@ function start() {
|
||||
cm.gainItem(4031847, -1);
|
||||
cm.gainItem(4031848, 1);
|
||||
|
||||
cm.setQuestProgress(2180, 0, 2);
|
||||
cm.setQuestProgress(2180, 1, 2);
|
||||
} else if(cm.canHold(4031849) && cm.haveItem(4031848)){
|
||||
cm.sendNext("Now filling up the bottle with milk. The bottle is now 2/3 full of milk.");
|
||||
cm.gainItem(4031848, -1);
|
||||
cm.gainItem(4031849, 1);
|
||||
|
||||
cm.setQuestProgress(2180, 0, 2);
|
||||
cm.setQuestProgress(2180, 1, 2);
|
||||
} else if(cm.canHold(4031850) && cm.haveItem(4031849)){
|
||||
cm.sendNext("Now filling up the bottle with milk. The bottle is now completely full of milk.");
|
||||
cm.gainItem(4031849, -1);
|
||||
cm.gainItem(4031850, 1);
|
||||
|
||||
cm.setQuestProgress(2180, 0, 2);
|
||||
cm.setQuestProgress(2180, 1, 2);
|
||||
} else {
|
||||
cm.sendNext("Your inventory is full, and there's no room for a milk bottle.");
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@ function action(mode, type, selection) {
|
||||
cm.sendNext("All right! Let's go!");
|
||||
} else if (status == 1) {
|
||||
cm.removeNPC(579711);
|
||||
cm.removeNPC2(579711);
|
||||
cm.updateInfo("fire", "0");
|
||||
cm.playSound("cannonshooter/fire");
|
||||
cm.sendDirectionInfo("Effect/Direction4.img/effect/cannonshooter/flying/0", 7000, 0, 0, -1, -1);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Map(s): Erev
|
||||
Description: 3rd job KoC Buff
|
||||
*/
|
||||
importPackage(Packages.constants);
|
||||
importPackage(Packages.constants.game);
|
||||
|
||||
function start() {
|
||||
if (cm.getPlayer().isCygnus() && GameConstants.getJobBranch(cm.getJob()) > 2) {
|
||||
|
||||
@@ -33,7 +33,7 @@ var maxJobType = 15;
|
||||
|
||||
function start() {
|
||||
var jobType = parseInt(cm.getJobId() / 100);
|
||||
if (jobType >= minJobType && jobType <= maxJobType && cm.canSpawnPlayerNpc(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
if (jobType >= minJobType && jobType <= maxJobType && cm.canSpawnPlayerNpc(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
spawnPnpc = true;
|
||||
|
||||
var sendStr = "You have walked a long way to reach the power, wisdom and courage you hold today, haven't you? What do you say about having right now #ra NPC on the Hall of Fame holding the current image of your character#k? Do you like it?";
|
||||
@@ -64,7 +64,7 @@ function action(mode, type, selection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
cm.sendOk("There you go! Hope you will like it.");
|
||||
cm.gainMeso(-spawnPnpcFee);
|
||||
} else {
|
||||
|
||||
@@ -39,7 +39,7 @@ function action(mode, type, selection) {
|
||||
status--;
|
||||
|
||||
if(status == 0) {
|
||||
if (!(cm.isQuestCompleted(20407) || cm.isQuestStarted(20407) && cm.getQuestProgress(20407, 9001010) != 0) && cm.getMap().countMonster(9001010) == 0 && cm.getMap().getNPCById(1104002) == null) {
|
||||
if (!(cm.isQuestCompleted(20407) || cm.isQuestStarted(20407) && cm.getQuestProgressInt(20407, 9001010) != 0) && cm.getMap().countMonster(9001010) == 0 && cm.getMap().getNPCById(1104002) == null) {
|
||||
cm.sendOk("... Hnngh... #b#h0##k, is that you...? #r#p1104002##k... She's already here... #b#h0##k, I'm truly sorry I can't help you right now in this state, just when a bigger threat appeared I could do nothing for my people.... Please I beg you, please defeat her, #b#h0##k!! ....");
|
||||
cm.spawnNpc(1104002, new java.awt.Point(850, 0), cm.getMap());
|
||||
} else {
|
||||
|
||||
@@ -5,7 +5,7 @@ var spawnPnpcFee = 7000000;
|
||||
var jobType = 21;
|
||||
|
||||
function start() {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
if (parseInt(cm.getJobId() / 100) == jobType && cm.canSpawnPlayerNpc(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()))) {
|
||||
spawnPnpc = true;
|
||||
|
||||
var sendStr = "You have walked a long way to reach the power, wisdom and courage you hold today, haven't you? What do you say about having right now #ra NPC on the Hall of Fame holding the current image of your character#k? Do you like it?";
|
||||
@@ -36,7 +36,7 @@ function action(mode, type, selection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
if(Packages.server.life.MaplePlayerNPC.spawnPlayerNPC(Packages.constants.game.GameConstants.getHallOfFameMapid(cm.getJob()), cm.getPlayer())) {
|
||||
cm.sendOk("There you go! Hope you will like it.");
|
||||
cm.gainMeso(-spawnPnpcFee);
|
||||
} else {
|
||||
|
||||
@@ -46,7 +46,7 @@ function action(mode, type, selection) {
|
||||
} else if (status == 2) {
|
||||
cm.sendNext("The other heroes? They've left to fight the Black Mage. They're buying us time to escape. What? You want to fight with them? No! You can't! You're hurt. You must leave with us!");
|
||||
} else if (status == 3) {
|
||||
cm.updateQuest(21002, "1");
|
||||
//cm.setQuestProgress(21002, 1);
|
||||
cm.showIntro("Effect/Direction1.img/aranTutorial/Trio");
|
||||
cm.dispose();
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ function action(mode, type, selection){
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var questProgress = cm.getQuestProgress(2330, 3300005) + cm.getQuestProgress(2330, 3300006) + cm.getQuestProgress(2330, 3300007); //3 Yetis
|
||||
var questProgress = cm.getQuestProgressInt(2330, 3300005) + cm.getQuestProgressInt(2330, 3300006) + cm.getQuestProgressInt(2330, 3300007); //3 Yetis
|
||||
if (!(cm.isQuestStarted(2330) && questProgress < 3)) { // thanks Vcoc for finding an exploit with boss entry through NPC
|
||||
cm.dispose();
|
||||
return;
|
||||
|
||||
@@ -83,7 +83,10 @@ function action(mode, type, selection) {
|
||||
else if (status == 2){
|
||||
cm.dispose();
|
||||
if (beauty == 1){
|
||||
if (cm.haveItem(5150005) == true){
|
||||
if (cm.haveItem(5420004)){
|
||||
cm.setHair(hairnew[selection]);
|
||||
cm.sendOk("Enjoy your new and improved hairstyle!");
|
||||
} else if (cm.haveItem(5150005) == true){
|
||||
cm.gainItem(5150005, -1);
|
||||
cm.setHair(hairnew[selection]);
|
||||
cm.sendOk("Enjoy your new and improved hairstyle!");
|
||||
|
||||
@@ -57,8 +57,10 @@ function action(mode, type, selection) {
|
||||
if (cm.getPlayer().getGuildId() < 1 || cm.getPlayer().getGuildRank() != 1) {
|
||||
cm.sendOk("You can only increase your Guild's capacity if you are the leader.");
|
||||
cm.dispose();
|
||||
} else
|
||||
cm.sendYesNo("Increasing your Guild capacity by #b5#k costs #b " + cm.getPlayer().getGuild().getIncreaseGuildCost(cm.getPlayer().getGuild().getCapacity()) +" mesos#k, are you sure you want to continue?");
|
||||
} else {
|
||||
var MapleGuild = Java.type("net.server.guild.MapleGuild"); // thanks Conrad for noticing an issue due to call on a static method here
|
||||
cm.sendYesNo("Increasing your Guild capacity by #b5#k costs #b " + MapleGuild.getIncreaseGuildCost(cm.getPlayer().getGuild().getCapacity()) +" mesos#k, are you sure you want to continue?");
|
||||
}
|
||||
}
|
||||
} else if (status == 2) {
|
||||
if (sel == 0 && cm.getPlayer().getGuildId() <= 0) {
|
||||
|
||||
@@ -22,14 +22,12 @@
|
||||
var status;
|
||||
var choice;
|
||||
var guildName;
|
||||
var partymembers;
|
||||
|
||||
var allianceCost = 2000000;
|
||||
var increaseCost = 1000000;
|
||||
var allianceLimit = 5;
|
||||
|
||||
function start() {
|
||||
partymembers = cm.getPartyMembers();
|
||||
status = -1;
|
||||
action(1,0,0);
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ function action(mode, type, selection) {
|
||||
cm.getMap().broadcastMessage(MaplePacketCreator.playSound("orbis/" + harpSounds[cm.getNpc() - 2012027]));
|
||||
|
||||
if(cm.isQuestStarted(3114)) {
|
||||
var idx = cm.getQuestProgress(3114, 7777);
|
||||
var idx = -1 * cm.getQuestProgressInt(3114); // infoEx without infoNumber, must use one progress only, critical hit!
|
||||
|
||||
if(idx != -1) {
|
||||
if(idx > -1) {
|
||||
var nextNote = harpSong[idx];
|
||||
|
||||
if(harpNote != nextNote) {
|
||||
cm.setQuestProgress(3114, 7777, 0);
|
||||
cm.setQuestProgress(3114, 0);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/wrong_kor"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Failed"));
|
||||
@@ -70,7 +70,7 @@ function action(mode, type, selection) {
|
||||
|
||||
if(idx == 45) { // finished lullaby
|
||||
cm.message("Twinkle, twinkle, little star, how I wonder what you are.");
|
||||
cm.setQuestProgress(3114, 7777, -1);
|
||||
cm.setQuestProgress(3114, 42);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/clear"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Clear"));
|
||||
@@ -88,7 +88,7 @@ function action(mode, type, selection) {
|
||||
}
|
||||
}
|
||||
|
||||
cm.setQuestProgress(3114, 7777, idx + 1);
|
||||
cm.setQuestProgress(3114, -1 * (idx + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ function action(mode, type, selection) {
|
||||
cm.getMap().broadcastMessage(MaplePacketCreator.playSound("orbis/" + harpSounds[cm.getNpc() - 2012027]));
|
||||
|
||||
if(cm.isQuestStarted(3114)) {
|
||||
var idx = cm.getQuestProgress(3114, 7777);
|
||||
var idx = -1 * cm.getQuestProgressInt(3114);
|
||||
|
||||
if(idx != -1) {
|
||||
if(idx > -1) {
|
||||
var nextNote = harpSong[idx];
|
||||
|
||||
if(harpNote != nextNote) {
|
||||
cm.setQuestProgress(3114, 7777, 0);
|
||||
cm.setQuestProgress(3114, 0);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/wrong_kor"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Failed"));
|
||||
@@ -70,7 +70,7 @@ function action(mode, type, selection) {
|
||||
|
||||
if(idx == 45) { // finished lullaby
|
||||
cm.message("Twinkle, twinkle, little star, how I wonder what you are.");
|
||||
cm.setQuestProgress(3114, 7777, -1);
|
||||
cm.setQuestProgress(3114, 42);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/clear"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Clear"));
|
||||
@@ -88,7 +88,7 @@ function action(mode, type, selection) {
|
||||
}
|
||||
}
|
||||
|
||||
cm.setQuestProgress(3114, 7777, idx + 1);
|
||||
cm.setQuestProgress(3114, -1 * (idx + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ function action(mode, type, selection) {
|
||||
cm.getMap().broadcastMessage(MaplePacketCreator.playSound("orbis/" + harpSounds[cm.getNpc() - 2012027]));
|
||||
|
||||
if(cm.isQuestStarted(3114)) {
|
||||
var idx = cm.getQuestProgress(3114, 7777);
|
||||
var idx = -1 * cm.getQuestProgressInt(3114);
|
||||
|
||||
if(idx != -1) {
|
||||
if(idx > -1) {
|
||||
var nextNote = harpSong[idx];
|
||||
|
||||
if(harpNote != nextNote) {
|
||||
cm.setQuestProgress(3114, 7777, 0);
|
||||
cm.setQuestProgress(3114, 0);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/wrong_kor"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Failed"));
|
||||
@@ -70,7 +70,7 @@ function action(mode, type, selection) {
|
||||
|
||||
if(idx == 45) { // finished lullaby
|
||||
cm.message("Twinkle, twinkle, little star, how I wonder what you are.");
|
||||
cm.setQuestProgress(3114, 7777, -1);
|
||||
cm.setQuestProgress(3114, 42);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/clear"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Clear"));
|
||||
@@ -88,7 +88,7 @@ function action(mode, type, selection) {
|
||||
}
|
||||
}
|
||||
|
||||
cm.setQuestProgress(3114, 7777, idx + 1);
|
||||
cm.setQuestProgress(3114, -1 * (idx + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ function action(mode, type, selection) {
|
||||
cm.getMap().broadcastMessage(MaplePacketCreator.playSound("orbis/" + harpSounds[cm.getNpc() - 2012027]));
|
||||
|
||||
if(cm.isQuestStarted(3114)) {
|
||||
var idx = cm.getQuestProgress(3114, 7777);
|
||||
var idx = -1 * cm.getQuestProgressInt(3114);
|
||||
|
||||
if(idx != -1) {
|
||||
if(idx > -1) {
|
||||
var nextNote = harpSong[idx];
|
||||
|
||||
if(harpNote != nextNote) {
|
||||
cm.setQuestProgress(3114, 7777, 0);
|
||||
cm.setQuestProgress(3114, 0);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/wrong_kor"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Failed"));
|
||||
@@ -70,7 +70,7 @@ function action(mode, type, selection) {
|
||||
|
||||
if(idx == 45) { // finished lullaby
|
||||
cm.message("Twinkle, twinkle, little star, how I wonder what you are.");
|
||||
cm.setQuestProgress(3114, 7777, -1);
|
||||
cm.setQuestProgress(3114, 42);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/clear"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Clear"));
|
||||
@@ -88,7 +88,7 @@ function action(mode, type, selection) {
|
||||
}
|
||||
}
|
||||
|
||||
cm.setQuestProgress(3114, 7777, idx + 1);
|
||||
cm.setQuestProgress(3114, -1 * (idx + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ function action(mode, type, selection) {
|
||||
cm.getMap().broadcastMessage(MaplePacketCreator.playSound("orbis/" + harpSounds[cm.getNpc() - 2012027]));
|
||||
|
||||
if(cm.isQuestStarted(3114)) {
|
||||
var idx = cm.getQuestProgress(3114, 7777);
|
||||
var idx = -1 * cm.getQuestProgressInt(3114);
|
||||
|
||||
if(idx != -1) {
|
||||
if(idx > -1) {
|
||||
var nextNote = harpSong[idx];
|
||||
|
||||
if(harpNote != nextNote) {
|
||||
cm.setQuestProgress(3114, 7777, 0);
|
||||
cm.setQuestProgress(3114, 0);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/wrong_kor"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Failed"));
|
||||
@@ -70,7 +70,7 @@ function action(mode, type, selection) {
|
||||
|
||||
if(idx == 45) { // finished lullaby
|
||||
cm.message("Twinkle, twinkle, little star, how I wonder what you are.");
|
||||
cm.setQuestProgress(3114, 7777, -1);
|
||||
cm.setQuestProgress(3114, 42);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/clear"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Clear"));
|
||||
@@ -88,7 +88,7 @@ function action(mode, type, selection) {
|
||||
}
|
||||
}
|
||||
|
||||
cm.setQuestProgress(3114, 7777, idx + 1);
|
||||
cm.setQuestProgress(3114, -1 * (idx + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ function action(mode, type, selection) {
|
||||
cm.getMap().broadcastMessage(MaplePacketCreator.playSound("orbis/" + harpSounds[cm.getNpc() - 2012027]));
|
||||
|
||||
if(cm.isQuestStarted(3114)) {
|
||||
var idx = cm.getQuestProgress(3114, 7777);
|
||||
var idx = -1 * cm.getQuestProgressInt(3114);
|
||||
|
||||
if(idx != -1) {
|
||||
if(idx > -1) {
|
||||
var nextNote = harpSong[idx];
|
||||
|
||||
if(harpNote != nextNote) {
|
||||
cm.setQuestProgress(3114, 7777, 0);
|
||||
cm.setQuestProgress(3114, 0);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/wrong_kor"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Failed"));
|
||||
@@ -70,7 +70,7 @@ function action(mode, type, selection) {
|
||||
|
||||
if(idx == 45) { // finished lullaby
|
||||
cm.message("Twinkle, twinkle, little star, how I wonder what you are.");
|
||||
cm.setQuestProgress(3114, 7777, -1);
|
||||
cm.setQuestProgress(3114, 42);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/clear"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Clear"));
|
||||
@@ -88,7 +88,7 @@ function action(mode, type, selection) {
|
||||
}
|
||||
}
|
||||
|
||||
cm.setQuestProgress(3114, 7777, idx + 1);
|
||||
cm.setQuestProgress(3114, -1 * (idx + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ function action(mode, type, selection) {
|
||||
cm.getMap().broadcastMessage(MaplePacketCreator.playSound("orbis/" + harpSounds[cm.getNpc() - 2012027]));
|
||||
|
||||
if(cm.isQuestStarted(3114)) {
|
||||
var idx = cm.getQuestProgress(3114, 7777);
|
||||
var idx = -1 * cm.getQuestProgressInt(3114);
|
||||
|
||||
if(idx != -1) {
|
||||
if(idx > -1) {
|
||||
var nextNote = harpSong[idx];
|
||||
|
||||
if(harpNote != nextNote) {
|
||||
cm.setQuestProgress(3114, 7777, 0);
|
||||
cm.setQuestProgress(3114, 0);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/wrong_kor"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Failed"));
|
||||
@@ -70,7 +70,7 @@ function action(mode, type, selection) {
|
||||
|
||||
if(idx == 45) { // finished lullaby
|
||||
cm.message("Twinkle, twinkle, little star, how I wonder what you are.");
|
||||
cm.setQuestProgress(3114, 7777, -1);
|
||||
cm.setQuestProgress(3114, 42);
|
||||
|
||||
cm.getPlayer().announce(MaplePacketCreator.showEffect("quest/party/clear"));
|
||||
cm.getPlayer().announce(MaplePacketCreator.playSound("Party1/Clear"));
|
||||
@@ -88,7 +88,7 @@ function action(mode, type, selection) {
|
||||
}
|
||||
}
|
||||
|
||||
cm.setQuestProgress(3114, 7777, idx + 1);
|
||||
cm.setQuestProgress(3114, -1 * (idx + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user