Jump to content

twostars

Administrators
  • Content Count

    1640
  • Joined

  • Last visited

Everything posted by twostars

  1. twostars

    Our quest script generator

    Knight Online has a lot of quests. Like, a lot. Hundreds, if not thousands. In part, this is due to the fact most are doubled up per-nation, but still -- for a game that's praised for its PvP, it has a lot of quests. Since their Reign of the Fire Drake expansion, their quest system was changed up considerably. All of their quests are now referenced in the client and a lot of the boilerplate logic has been wrapped up (it's still a horrible system though, but it's an improvement over the original). When we got to the point with the server's development where we seriously started considering releasing a server, one of the first things that came to mind was how many quests there were, and how much of a daunting task that would be to implement them. Honestly, at this point I was desperate to find some way of not having to deal with writing these up manually -- because it was a colossal task, which would be prone to introducing bugs. We realised that with the information provided, we could use this to automatically generate ~95% of quests automatically. There are outliers (for example, chain quests), but 95% of the hundreds of quests that exist is still huge. So Aesteris mocked up the initial implementation of our quest script generator, to give us an idea of how we were approaching it. We ended up rewriting it after that, but now it generates every quest it can (and we fill in the rest), e.g. this simple quest (this one doesn't have class-specific logic; the generated output can get more complex than this): ------------------------ -- Quest: Hasten potion -- Speed potion vial is awarded for 2 Apples of Moradon. ------------------------ function Event314_NotStarted() pUser:SelectMsg(4, 82, 315, 22, 315, 23, -1) end function Event315_Start() pUser:SaveEvent(82, 1) end function Event319_PendingReward() if pUser:CanRunQuestExchange(29) then pUser:SelectMsg(5, 82, 315, 10, 317, 27, -1) else pUser:SelectMsg(2, 82, 315, 10, -1) end end function Event317_Complete() if byEventStatus == 1 then pUser:SaveEvent(82, 3) elseif byEventStatus == 3 then if pUser:CheckExistEvent(82, 2) then return end if pUser:RunQuestExchange(29, bySelectedReward) then pUser:SaveEvent(82, 2) else pUser:SelectMsg(3, -1, 11, 10, -1) end end end Officially there are occasionally some quests which have extra filler text which this can't support (because it knows nothing about these extra steps), but they're often fluff and don't offer anything of importance. Most players probably even skip these, so they're never really a huge priority to support. And that's our script generator. The thing that makes our quests possible (because I was never going to write those manually; you can't make me do it. Nope.).
  2. The client we're currently using for ApexKO is the official 2.1xx client with many, many custom improvements patched in. Our update process Keeping things up-to-date with official seems daunting, but our process works fairly well. First, Aesteris unpacks the official client executable. Then we run it through our patcher (see below for more info), and - provided there's no major changes we need to update the patcher for - it patches it up in seconds. Then we need to ensure there's no breaking changes with the server, so we hook it back up to our local server, and essentially go bug hunting (needless to say, this part sucks -- USKO needs actual changelogs ). Regarding keeping the .TBLs (main client data) synced, we have a git repository setup to track changes to both our patches, and USKO's. We commit the TBLs in each patch which gives us a nice diff to compare changes. This means that we can then use git to merge them, which - although we still have to go over conflicts (with stuff we've added) - saves so much time. Barring anything new that needed to be implemented as a result of this patch, that's it -- we're done. Our patcher From the very start we realised it would be a pain to have to manually patch every single one of our patches in our growing patch collection every time USKO updated their client. So for this reason, we wrote a patcher to 1. find and 2. patch in our patches generically. This has definitely paid off, as it has for sure saved us an extraordinary amount of time; it could take us a few days to manually apply all of our patches for a single patch. With the patcher, this happens in mere seconds. Every so often we do need to update our patcher to support new clients, because they change things in major unexpected ways (like the code the patch was fixing was entirely changed, be it because of the compiler or simply because they changed the logic of the method), but even so, this still saves us a ton of time. Our patches Right now we have 50 odd base patch "groupings" and a considerable amount of patches (and their respective finders) in each of these groups. We have patches for all sorts; like increasing limits, fixing broken or inconsistent behaviour (e.g. fixing UI behaviour, the blinding effect, broken premium checks, party list / targeting behaviour, etc, etc, etc), implementing new behaviour (e.g. antialiasing support, saving & loading the party UI's position, logic to allow the client to handle the removal expiration of items correctly, or allowing for our kick behaviour in event parties). There's a ton in there; all-in-all, our patches are ~8,000 lines of code. I'm very glad we don't need to patch these manually. Patching these things manually is always a tedious task. It essentially involves getting inside mgame's head and figuring out how they'd have implemented it, with the assistance of the leaked client source (~1.06x). From there, using a debugger or disassembler to track down where this particular logic is implemented (which can take hours for more fiddly things), and then reversing how their logic works. With an understanding of how the logic is implemented and why the issue exists, we can start to develop a patch for solving it. Once the initial patch is written up, we test it until it's working as-intended (without any side-effects), and then write up finders for where the patch needs to go and anything it needs to reference. Finally, we can then rewrite the patch for the patcher, re-patch the client and re-test to be sure the patch is still correct. And that's about it... There's not a whole lot to say about the client, really. Beyond the custom patches, the client is more or less official -- for now.
  3. twostars

    Our server

    Unlike other servers, we've put a lot of work into our server -- several years worth, in fact. Actually, I can safely say that we're the reason that most people are even using source code to develop servers now, rather than messing with the official binaries. This is why I'd like to go into some detail about our server, since it's not something that's usually talked about outside of bug reports and such. A brief history Our server was initially created as a result of our attempts to push open source development in the Knight Online community, in 2012~2013. The project's intent was to update the official C++ source files (for ~1.06x) to a usable state for community learning purposes. Although the project ultimately went closed source due to lack of community attention, in the years since then we've made leaps and bounds with the project, rewriting most systems from the ground up to behave in a more logical and optimised fashion, doing our best to respect both DRY (Don't Repeat Yourself) and KISS (Keep It Simple, Stupid) principles, as well as updating to support the latest version of Knight Online (2.1xx at the time of writing). It has been a monumental undertaking, but in doing so, we've learned a lot about how the official server works (and even more about how it doesn't), and have always striven to improve upon it (as well as our own implementation). Accuracy While we do deviate in some regards (with good intentions), accuracy is very important to us. We have spent a great deal of time reversing official server and client binaries, as well as testing behaviour on official and scouring through its packet logs. As-is, we're confident that in most respects that have any importance (e.g. damage calculations, rates, etc.) our implementations behave the same as (or very, very close to) official's. Cheat detection While official and 99% of private servers rely on client checks to detect cheating, we do not believe in playing this easily-bypassable game of cat and mouse. As such, our server is very proactive in its detection of cheat methods to lock them down permanently, i.e. with no means of bypass. From ensuring we deal with client input in a safe manner to things like verifying every step of the skill casting process, or enforcing tight server-side collision and movement speed checks, we always strive to ensure that players have no vector for abuse. Obviously this is always a work-in-progress and isn't perfect or complete (what is?), and we're introducing new logic to prevent more general cheating behaviour as it pops up, but we're proud of how far we've come - and that we've come so far compared to official (and other private servers) in this regard. Performance Aesteris and I have both put years into developing this server (and I'm sure there's many more to come), and at this point I'm confident in saying our server performs - in most respects - better than official. On this note, we've found that many official bugs are caused by design flaws or simply their tendency to copy & paste their logic (and miss things). During implementation, we are always ever-present of performance concerns, be it in regards to how much time/resources a player request can consume (or anything in general), how costly a database hit will be, or even how much data is being (unnecessarily) sent to players -- performance matters to us, because it matters to players. A server falling under its own weight isn't worth playing. Zone instances are one interesting example of this. Officially and in 99% of private servers, "instances" are implemented such that when dealing with anyone in an instance, it still has to deal with all players in that zone (i.e. all instances of that zone). So instead of the 16 people we want to deal with in our Border Defense War instance, we deal with the 200 players across all of them. Here, we implement this system fairly logically: each instance is a self-contained unit attached to a zone. When dealing with players (or NPCs/monsters for that matter) in these instances, we only ever deal with the 16 actually in it. Similarly, officially we've noticed they tend to scan the entire server when looking for players to affect with skills nearby. As always, this extends to private servers as well, though most will have this (slightly) optimised from when this was open source. Here, of course, we only ever look for those actually near the player. This extends even to our database implementation. Beyond optimising the database design to avoid unnecessary or overly intensive lookups, we've also moved away from Microsoft SQL Server as - while it's a decent product - in several situations, it doesn't fit our performance needs (we also mostly moved away from Windows in general, which was another reason for dropping it). While not all are, many of our performance improvements are entirely noticeable by players. For example: unlike official or other private servers, there is close to no delay in logging in and selecting your character (the only delay is your own connection latency; officially and on other private servers, these backend requests take quite some time themselves). Additionally, we optimise our outgoing traffic to avoid congestion on the player side -- which saves you (and us) bandwidth, and means the client isn't bogged down as much processing the traffic. Events (and timing) Although fairly common with most of our systems, I feel that our event system (in no small part because of our timed event system) should be pointed out in particular as it is a colossal improvement over the way official implements events (as well as other private servers). Officially (and again, other private servers -- these go hand in hand), events are scheduled based on specific time checks. That is, if an event is scheduled at 01/02/2017 12:30PM, their game timer will check (every 6 seconds) if the current time matches. That is, it'll check if the day is 1, month is 2, year is 2017, hour is 12 and minutes are 30. Every 6 seconds. This means that issues with clock changes can easily upset it, not to mention issues with restarts not realising it has yet to run even though the time has passed (because it isn't exactly that time!). Here, we have a scheduler for timed events. Times scheduled in the past will run immediately, while times in the future will run once that time has passed. As always, we're ever-present of performance concerns, and scheduling in this manner can be very sensitive performance-wise, but in its present state our scheduling system performs wonderfully. Virtually everything timing-related in our server runs via this system in 1 of 2 ways (again, for performance reasons): in a "precise" mode, where we require a higher granularity (e.g. skill timings), or in a general mode for everything else that matters a lot less (e.g. event scheduling). From scheduling to running parts of the events, timing is very important with events. As I've mentioned previously, our implementations aim to behave logically. We also aim to keep features as self-contained as possible, unlike official, where you have random logic strewn about that exists that doesn't have an obvious use until you determine it's for, say, a specific case in an event. Obviously, when your codebase is littered with random things like this, it's very difficult to maintain, and very prone to bugs. We're all familiar with the bugginess of Knight Online; official servers, particularly. This is why. In contrast, we keep all of our event logic with the rest of that event's logic. And I don't mean just keeping it in the same source files. I mean, as a common example, if we need to handle the death of a player or monster in this event, we implement a specialized zone instance class for this event's instance, and override its OnDeath() event. Meaning, it's only ever handled in this event by design and no other logic needs to be aware of it. As previously said: we aim to implement things logically, in an attempt to keep things readily maintainable and avoid bugs. Custom behaviour While accuracy is important to us, so is an improved player experience. For starters, we're perfectly comfortable with taking features and reworking them into something that can be of use. For example: our in-game Class Transfer feature. This feature doesn't exist officially; it uses the official Nation Transfer feature to accomplish this, as the UI provides the ability to change their desired features -- which is the only time a player needs to make a decision (beyond their desired class, which we accomplish by prompting for that in the NPC -- easy!). Another example of this is taking their event system and reimplementing the Forgotten Temple and Juraid Mountain events to work with it, so players can now simply use the sign-up feature to access this event, rather than finding and talking to their respective NPCs. This means a much nicer user experience and increased participation to the events. And how about our clan banks? Their inn UI was easily repurposed for this custom feature that again, does not exist officially. And to finish this off... It's very easy to see this as "another server", but you need to realise that everything implemented in the game -- everything! -- has been written by us, at this point, from scratch. At the beginning of this project (which if memory serves was aiming to get it up and running with 1.8xx), we didn't have things like merchanting, we didn't have upgrades, let alone any type of event (even old events like Forgotten Temple or Bifrost). For a while I personally didn't really think we'd end up getting it anywhere, but continued to work on it in my spare time regardless. Now we have a fully-featured, highly optimised server implementing almost everything official has to offer. We've come a very, very long way in this time. We have more work to do (as always), but I hope this at least gives a small glimpse into what's actually involved behind-the-scenes in actual server development and why we're different to other servers.
  4. twostars

    Oreads voucher

    Refunded.
  5. twostars

    Chaos event register didn't show up

    This is because the signup UI was minimised when the signup notice went out. This is a bug with the official client. It's been somewhat fixed for the next patch.
  6. twostars

    Cape Color on Alliance

    Okay, after looking into it, this isn't exactly intended and I've tweaked this slightly. What's meant to happen is you can use your own colouring when you're accredited (which we somewhat allowed for). Right now we don't have any reliable means of determining if the colour was actually set, which I think was where the hiccup was before, so it'll immediately just switch over after you're promoted to accredited regardless. You'll have to set it. I may change this in a future update, but for now it should behave more accurately (in the next patch).
  7. twostars

    Ronark Land Board Bugg

    This has been fixed (for realsies) in the next patch.
  8. twostars

    No Timer for Events

    This has been somewhat fixed in the next patch. The problem as-is, is the minimised icon will disappear as it thinks it's trying to open the UI. But that part of it doesn't work because there's multiple UIs for it, and it doesn't implement the correct logic for it. Ideally I'd correct this so that it works as intended (it "restores" the UI so you see the new event prompting for you to signup), but for now the best I can do is stop it from hiding the icon. Because when it's minimised... and you lose the icon to restore it, it's not recoverable until you relog. So it'll stay minimised until you restore it yourself. As opposed to breaking completely. Additionally I'll probably add in notices announcing events are in the signup phase so you can know that they're actually up and you should restore it. Not ideal, but an improvement.
  9. twostars

    Wtf is this pus shit

    I think this tends to happen when the Cloudflare server that's closest to you has issues, hence why it only happens to you -- for a time -- and not others. We'll be changing this in next week's patch so it hopefully shouldn't be an issue in future, but for now all I can say is it should fix itself soon. For right now, I can't do much more than that unfortunately.
  10. twostars

    Ultima spawn at csw time

    This has been fixed; Ultima will no longer spawn during CSW.
  11. twostars

    In-game titles

    Trainee Soldier Defeat 100 Enemy User Attack: +10 Soldier Defeat 500 Enemy User Attack: +10 Defense: +20 General Defeat 1,000 Enemy User Attack: +13 Defense: +1 Berserker Defeat 5,000 Enemy User Attack: +26 God of War Defeat 10,000 Enemy User Dagger resist: +1 Jamadar resist: +1 Sword resist: +1 Over God Defeat 20,000 Enemy User Defense: +10 Dagger resist: +1 Sword resist: +1 Mace resist: +1 Axe resist: +1 Overmind Defeat 30,000 Enemy User STR: +1 HP: +2 DEX: +1 INT: +1 MP: +1 Attack: +13 Can't Lose Succeed in Revenge x 100 Attack: +20 Revenger Succeed in Revenge x 500 Defense: +70 Hatred Succeed in Revenge x 1,000 Attack: +20 Defense: +40 Fighter Win 100 times against another user at Moradon Duel HP: +4 Attack: +4 Undaunted Win 1,000 times against another user at Moradon Duel STR: +1 HP: +3 DEX: +1 INT: +1 MP: +1 Arena Legend Win 10,000 times against another user at Moradon Duel STR: +9 Ardream Veteran Defeat 100 Enemy Nation User at Ardream Glacier damage: +6 Ardream's Revenger Succeed 100 times of Revenge in Ardream STR: +6 Military Base Veteran Defeat Enemy Nation User 100 times in Ronarkland HP: +6 Military Base Revenger Succeed 100 times of Revenge in Ronarkland DEX: +6 Ronarkland Soldier Defeat Enemy Nation User 100 times in Ronarkland HP: +2 Attack: +5 Defense: +5 Ronarkland Warrior Defeat Enemy Nation User 500 times in Ronarkland HP: +1 DEX: +5 Ronarkland Veteran Defeat Enemy Nation User 1,000 times in Ronarkland Attack: +20 Defense: +10 Ronarkland Legend Defeat Enemy Nation User 10,000 times in Ronarkland Attack: +33 Ronarkland Revenger Succeed in Revenge 100 times in Ronarkland MP: +10 Lunar War Soldier Defeat Nation User 100 times in Lunar War STR: +4 HP: +1 Lunar War Warrior Defeat Nation User 500 times in Lunar War STR: +5 HP: +1 Lunar War Veteran Defeat Nation User 1,000 times in Lunar War Attack: +15 Defense: +15 XP: +1% Lunar War Legend Defeat Nation User 10,000 times in Lunar War INT: +20 Lunar War Revenger Succeed in Revenge 100 times in Lunar War DEX: +10 Commander Win 100 times in Lunar War HP: +9 Impregnable Win 100 times in Nation Guard Battle Defense: +90 The Best Win First Place 10 times in Chaos War INT: +2 MP: +4 Most Popular Win First Palce 100 times in Chaos War STR: +5 HP: +4 2nd Best Win Second Place 10 times in Chaos War MP: +7 3rd Best Win Third Place 10 times in Chaos War HP: +2 DEX: +3 Commander of Chaos 30 or more kills in Chaos War Dagger resist: +1 Jamadar resist: +1 Gone Mad 40 or more kills in Chaos War INT: +14 For better or worse 50 or more kills in Chaos War Attack: +13 NP: +1 King of Evil Spirit Win 100 times at Juraid War HP: +5 INT: +10 Crown Prince Cumulative Win x 10 at Castle Siege NP: +1 XP: +1% King Cumulative Win x 50 at Castle Siege Attack: +20 NP: +2 Emperor Cumulative Win x 100 at Castle Siege NP: +2 Spearhead At Lunar War, defeat #1, #2 Chief Guards Flame damage: +1 Glacier damage: +3 Lightning damage: +1 Defeated Enemy General Defeat Chief Gate Keeper at Lunar War Flame damage: +1 Glacier damage: +1 Lightning damage: +3 Darkness Shadow Complete Assassin Expert I and II HP: +4 DEX: +6 Hunter Complete Bulk of Silk Defense: +5 Novice Hunter Defeat 100 Ronarkland Monster Attack: +3 Noob Defeat 1,000 Ronarkland Monster HP: +2 Novice Archer Defeat 5,000 Ronarkland Monster Attack: +5 Defense: +5 XP: +1% Chaser Defeat 10,000 Ronarkland Monster MP: +6 XP: +2% Beast Master Defeat 30,000 Ronarkland Monster Glacier damage: +8 Previous Life Do not get killed and defeat 100 monsters Attack: +2 Defense: +4 Proficient Do not get killed and defeat 1,000 monsters INT: +4 Expert Do not get killed and defeat 10,000 monsters Defense: +40 Four Phases of Life Do not get killed and defeat 100,000 monsters Attack: +10 XP: +3% Immortal Do not get killed and defeat 1,000,000 monsters Attack: +25 Defense: +5 Sprout Defeat 1 Worm in Moradon HP: +1 Street Smart Defeat [Chief] Hideous, [Chief] Bandiking in Moradon Ignorant Complete Wings in the Fog 1, and 2 in Moradon MP: +3 Patience Defeat 100 Gliptodont STR: +1 HP: +1 Wolf Hunter Defeat 100 Dire Wolf, Shadow Seeker, Loup-garou, Lycan HP: +1 DEX: +1 Deadly Poisonus Defeat Pincer or Paralyzer or Scorpion DEX: +2 Undead Hunter Defeat Rotten Eyes and Undying MP: +2 All Resource Guardian Defeat 100 Shadow Cracks Troller (Castle) Defeat 200 Gaf or Troll Bony (Castle) Abandoned Bones I & II DEX: +3 Goblin's Enemy (Castle) Complete Goblin Family I & II INT: +6 MP: +2 Awesome Expert (Castle) Defeat Aif x 2000 STR: +1 HP: +1 DEX: +1 INT: +2 MP: +1 Fireworks (Castle) Complete Extreme Pain, Flaming Heart Flame damage: +4 Skull King (Castle) Defeat 200 Dragon Tooth Commander, 200 Dragon Tooth Skeleton HP: +5 Orc's Enemy (Castle) Complete Orc Slayer I & II STR: +3 Blitz Defeat 100 Storming Spostle in Eslant Lightning damage: +2 Whipped Defeat 100 Balog in Eslant Flame Defeat 100 Apostle of Flames in Eslant Flame damage: +2 Solid Defeat 200 Titan or Dark Stone in Eslant Defense: +20 Chill Defeat 100 Apostle of Piercing Cold in Eslant Glacier damage: +2 Blue Skin Defeat 100 each for Forwird or Forwird Warrior; Forwird Knight or Captain in Ronark Land Base Attack: +3 Defense: +1 Phantom Defeat 1000 Phantom in Desperation Abyss STR: +1 XP: +1% Queen Complete Server of the Queen, For Knights in Hell Abyss STR: +2 HP: +2 Hate Spider Defeat 1000 Taratula in Delos Basement DEX: +1 XP: +1% Underworld Complete Testing the King and Nightmare of Spiderman in Delos Basement HP: +1 DEX: +3 Archeologist Complete Draki's Trace and Tracks in Ronarkland INT: +10 Guardian Complete Guardian of the Guardian Tower I and II in Ronarkland STR: +4 Elder Complete Ronarkland Elder I and II in Ronarkland HP: +3 INT: +4 Task Expert Complete Work Procedure I and II in Ronarkland HP: +4 INT: +2 Dragon Slayer Defeat 100 Red Dragon in Ronarkland Flame damage: +9 Most Speedy Destroy Chaos Stone 100 Times in Ronarkland Attack: +10 Defense: +60 Like a Dog Defeat 1000 Goloras in Ronarkland Flame damage: +5 Orc Slayer Complete In Between the Arrow and Magic and In Between Two Swords in Ronarkland Sword resist: +2 Bow resist: +1 Not a Sinner Complete 4 Sins and 3 Sins in Ronarkland Flame resist: +2 Glacier resist: +1 Lightning resist: +2 Magic resist: +1 Curse resist: +2 Poison resist: +2 Chaos Domination Complete Monster born in Chaos I and II in Ronarkland Flame damage: +2 Glacier damage: +3 Lightning damage: +3 Slayer Defeat Red Dragon and Dark Dragon HP: +2 Jamadar resist: +1 Juraid Knight Complete Juraid Monster III and Seed of Evil in Jurad Lightning damage: +6 Magician Defeat Krowaz in Krowaz's Dominion Flame resist: +8 Ursa Defeat 100 Minotaur in Krowaz's Dominion MP: +1 XP: +1% Treasure Hunter Defeat 10 Treasure Boxes in Krowaz's Dominion DEX: +4 Castle Destroyer Do not get killed and defeat Mammoth the 3rd to Crashergimmic Lightning damage: +7 Kimera Do not get killed and defeat Purious DEX: +7 NP: +1 Saved from the Flame Do not get killed and defeat Mammoth the 3rd to Pluwitoon HP: +7 NP: +1 Fire Destroyer Do not get killed and defeat Mammoth the 3rd and [Destroyer of Flame] Pluwitoon STR: +7 NP: +1 Castle King Complete Immortal of Under the Castle I and II HP: +3 NP: +1 ¡Ú KNIGHT 11TH ¡Ú Complete 11th Anniversary Quest of Julian STR: +1 DEX: +1 INT: +2 MP: +1 2013 Thanksgiving Deliver 50 Moon pieces to Magipie Mother for the year 2013. HP: +4 13Th Snow Knight 13Th Snow Knight HP: +3 Glacier damage: +2 Glacier resist: +2 Relic Protector Relic Protector XP: +5% Juraid Protector Win 150 times at Juraid War Defense: +100
  12. twostars

    Some Topic Suggestions for the Forums

    Just dumped these from the database, hopefully it's readable enough:
  13. twostars

    Yet another d3d9.dll Error

    Please try downloading Teamviewer and send me a PM with the ID and password it provides. Thanks.
  14. twostars

    OTP Disable??

    Please send me a PM with as many of your known account details as possible. Thankyou.
  15. twostars

    inbox is full problem.

    I think it should start to fix itself now. Thanks for letting me know
  16. twostars

    inbox is full problem.

    I raised the limit. Is it alright now?
  17. twostars

    Party Heals Fail Upon Teleportation

    This was resolved.
  18. twostars

    PUS Issue

    I don't see any transactions on that account, so I'm a little confused as to whether you're looking to pay via an alternate method (which we can't do, sorry) or you're having an issue with an existing transaction (which I can't see on your account).
  19. twostars

    Ban time

    48 hours from the time of the ban.
  20. twostars

    Question to the community

    We addressed a couple of causes for this, but need to identify this particular cause.
  21. twostars

    List of bugs 2017

    Okay, I'm a little confused as to what the problem actually is here. 1. The NP reward is only divvied up between the party members in this case. Its NP distribution is handled independently to regular mobs/NPCs. 2. As it's independent, it has nothing to do with their damage contribution. So with these misleading assumptions out the way -- are you saying then that the reward is simply very small?
  22. twostars

    Party Heals Fail Upon Teleportation

    I had trouble reproducing this when it was brought up recently, but I think this only happens if you're teleported mid-cast. The existing cast will fail, and then the next cast will also fail -- unless you wait a sec (and/or move?).
  23. twostars

    item gone

    Character name?
  24. twostars

    Help me , I wrong purchase from the pus

    Refunded. Thanks for your patience.
  25. twostars

    Wrong purchase from the PUS

    Refunded.
×