Jump to content

Angelix

Community
  • Content Count

    537
  • Joined

  • Days Won

    74

Angelix last won the day on February 2

Angelix had the most liked content!

Community Reputation

384 Excellent

About Angelix

  • Rank
    Sea Captain

Recent Profile Visitors

16,126 profile views
  1. If you kept CA untouched, then entering when the portal opens and waiting for 5 minutes should spawn some monsters. No boss is located in there.
  2. That just means the map containing that area is not enabled on any of your opened GameServers. Chaos Argent is called "garner2", while other small maps like Abandoned Mine are within "eastgoaf". So just enable those maps in your GameServer by adding the line "map = garner2" (for example) in the configuration file.
  3. More than likely a feature used on servers before, but more prominent on "Corsairs Online". Like the jewels used to make an equipment have an offensive or defensive version.
  4. If I'm not mistaken, that means that the actual effect is missing an icon and it's just using the default placeholder. So wherever your effect icons are defined, check for that effect and define one if it's empty or make sure that the image that's defined actually exists.
  5. Since I made the code and just don't to sit on it since it has no use for me, I'll share it. The following script is a different method of approaching the desired result you want. function Skill_Xlzh_End(ATKER, DEFER, SkillLevel) if GetCtrlBoat(DEFER) ~= nil then SkillUnable(ATKER) return end local Time = 180 + SkillLevel * 20 if SkillLevel == 10 then SkillLevel = SkillLevel + math.floor(Sta(ATKER) / 20) SkillLevel = math.min(SkillLevel, 20) end AddState(ATKER, DEFER, STATE_XLZH, SkillLevel, Time) end function State_Xlzh_Add(Player, StateLevel) local MnATK_DIF = 0.1 + 0.01 * StateLevel local MxATK_DIF = 0.1 + 0.01 * StateLevel if StateLevel >= 10 then StateLevel = StateLevel - 10 MnATK_DIF = 0.1 + (0.01 * 10) + (StateLevel * 0.001) MxATK_DIF = 0.1 + (0.01 * 10) + (StateLevel * 0.001) end local MnATK = math.floor((MnatkSa(Player) + MnATK_DIF) * ATTR_RADIX) local MxATK = math.floor((MxatkSa(Player) + MxATK_DIF) * ATTR_RADIX) SetCharaAttr(MnATK, Player, ATTR_STATEC_MNATK) SetCharaAttr(MxATK, Player, ATTR_STATEC_MXATK) ALLExAttrSet(Player) end function State_Xlzh_Rem(Player, StateLevel) local MnATK_DIF = 0.1 + 0.01 * StateLevel local MxATK_DIF = 0.1 + 0.01 * StateLevel if StateLevel >= 10 then StateLevel = StateLevel - 10 MnATK_DIF = 0.1 + (0.01 * 10) + (StateLevel * 0.001) MxATK_DIF = 0.1 + (0.01 * 10) + (StateLevel * 0.001) end local MnATK = math.floor((MnatkSa(Player) - MnATK_DIF) * ATTR_RADIX) local MxATK = math.floor((MxatkSa(Player) - MxATK_DIF) * ATTR_RADIX) SetCharaAttr(MnATK, Player, ATTR_STATEC_MNATK) SetCharaAttr(MxATK, Player, ATTR_STATEC_MXATK) ALLExAttrSet(Player) end The script above is a quick example of the Herbalist skill "Spiritual Fire" (little modified though(. Normally a character only has access to skill levels from 1 through 10. If I'm not mistaken the default formula is a base 10% increase in attack plus an additional 1% per skill level, this means it gives 11% at level 1 and a maximum of 20% at level 10. The modified script above uses the default process and amplifies it with the character's spirit stat only if the skill casted is level 10. This means that from skill level 1 through 9, the calculation is the same. At skill level 10, every 20 points of spirit will give it an extra level which in turn give the other player an extra 0.1% of attack. This is up to a maximum of 10 extra levels. In the script this would mean that the character using the skill needs to have the skill at level 10 and a minimum of 200 spirit to be able to fully maximize the buff given to another player. This method uses the server's regular functions and has a limit of skill level of 20, anything above will make the skill not work at all. From this point on, it's up to you to edit the values to the ones you desire and apply it to any other skill wanted. I will not explain further since I think it's straight and simple.
  6. Do you have any lua_err.log messages or on GS console?
  7. Regarding #1: Quick example... I have a file called "LuaSQL Handler.lua": SQL = SQL or {AccountServer = {}, GameDB = {}, TradeDB = {}} dofile(GetResPath('../LuaSQL Info.lua')) Which calls "LuaSQL Info.lua" that contains: SQL.AccountServer.Name = 'AccountServer' SQL.AccountServer.Host = '127.0.0.1' SQL.AccountServer.User = '' SQL.AccountServer.Pass = '' SQL.GameDB.Name = 'GameDB' SQL.GameDB.Host = '127.0.0.1' SQL.GameDB.User = '' SQL.GameDB.Pass = '' SQL.TradeDB.Name = 'TradeDB' SQL.TradeDB.Host = '127.0.0.1' SQL.TradeDB.User = '' SQL.TradeDB.Pass = '' This helps to keep information separate for server with dev teams and each having their unique logins. We then go back to "LuaSQL Handler.lua" and have these function: function GetChaColumnValue(Player, Column) local Name = GetChaDefaultName(Player) local String = "SELECT "..Column.." FROM "..SQL.GameDB.Name..".dbo.character WHERE cha_name = '"..Name.."'" local Connect, CID = LuaSQL(SQL_CONNECT, SQL.GameDB.Host, SQL.GameDB.User, SQL.GameDB.Pass) if Connect == SQL_SUCCESS_WITH_INFO then local Success, Query = LuaSQL(SQL_QUERY, CID, String) if Success == SQL_SUCCESS_WITH_INFO then local Data = LuaSQL(SQL_FETCH, CID, Query) LuaSQL(SQL_FREEHANDLE, CID, Query) LuaSQL(SQL_CLOSE, CID) if Data == SQL_NO_DATA then return -9999 else return Data[Column] end end end end function SetChaColumnValue(Player, Column, Value) QueryAsync(SQL.GameDB.Host, SQL.GameDB.User, SQL.GameDB.Pass, "UPDATE "..SQL.GameDB.Name..".dbo.character SET "..Column.." = "..Value.." WHERE cha_name = '"..GetChaDefaultName(Player).."'") end Which in turn can be used as any regular lua function. Quick example: function ExFuncA(role) if HasGuild(role) == LUA_FALSE then SystemNotice(role, 'Random Text') return LUA_FALSE end if GetChaAttr(role, ATTR_GD) < 1000000 then SystemNotice(role, 'Random Text') return LUA_FALSE end local CheckLock = GetChaColumnValue(role, "exotic_unlock") if CheckLock == 1 then -- Already unlocked? SystemNotice(role, 'Random Text') return LUA_FALSE end SetChaColumnValue(role, "exotic_unlock", 1) TakeMoney(role, nil, 1000000) end Obviously it has to be fitted to your needs and corresponding table/columns, but it should give you an idea. Regarding #2: DeductGuildItem That function should be when a player finishes creating a guild. AskJoinGuild That function should be when a player requests to join a guild. Regarding #3: Like I mentioned, at this point I don't think it matters whether it's safe or not, but more about accessibility and having a stable server I guess? Considering: LuaSQL: Run a query per guild register. Run a query upon each NPC access to check whether they have the feature unlocked. Run several queries upon unlocking the feature (or more features upon expanding this system). Text Table: Load table into variables just once upon the first player accessing any guild feature. Save table each time a variable is modified, no need to save if no changed done.
  8. Congratulations! This is something out of the norm for this forum. Now, a few things... I know you said this was created/tested on a development server, but that shouldn't stop you from thinking big and considering all the possible things that can pop up during a live server! Take this script as a draft and improve on it! Maybe create a separate LuaSQL handler file? That way you don't have to re-create the SQL naming, call, check and compare process each time? Ex: Create function "ReadTableColumn(<Table>, <Column>, <Row>)" in which you input the table you want to read and the column that matches the row you're inserting (not actual procedure, just light thinking). Upon guild creation (there's an existing lua function for that in any server), try inserting the guild leader's ID into SQL. This should solve your issue of previous records. Upon guild creation, check if that column has an existing value, if yes, then reset via LuaSQL the records. Have you given using text file as a way to save this information instead of LuaSQL? That's if you're containing everything to a single GameServer, not using multiple function across all maps and such. I think using LuaSQL on such a common basis without any cooldown could potentially slow/hang the server if it has a big population. Using text-based method, you only need to load it once and just save it each time there's a change in variables. Just a few things to consider.
  9. Why not try copying what I sent? Either way, here's some tips: The number "62" is quest ID, which is only used to tie a quest to an NPC, does not need to be used anywhere else. "NoMission" should be 58 in your case. Maybe mission ID 58 is used somewhere else? Server files don't matter, I'm using the regular quest system as you can see in the script.
  10. I just showed you that changing the ID did in fact fix the issue...
  11. Check if your ISP allows you to open ports. If yes, open port 1973 (default port). Change IP in text file for your public IP. Compile text files. Share bin files to your friends. Use tools or batch files to create accounts for them.
  12. Have you tried both ID being below 6000? I just changed the ID and it worked...
  13. If I'm not mistaken, this is from ROSO. They allow players to submit custom app, but the players have to provided all the files needed for this according to those rules initially posted. This is their page for custom apparels.
  14. elseif item.func == KopSummon then PRINT( "ActionProc:KopSummon" ) return KopSummon( character, MonsterID ) elseif item.func == KopSummon then return KopSummon(character, item.p1)
  15. Look through skilleffect.lua and search these 4 functions: Phy_Dmg Phy_Dmg_A Pow_Dmg Magic_Dmg These 4 functions contain this specific calculation (may contain different variable name): math.min (0.85 , phy_resist/100 ) This shows that a value of 85 in the attribute ATTR_PDEF is the maximum. Change that to however you like, but don't remove it altogether since that would make that attribute useless.
×
×
  • Create New...