post updated with an important information!
Beiträge von Ikarus_ Developer
-
-
Hey there,
im thinking about to buy a new offlineshop.
i am an old ikarus customer but his support is atm bad af.
my buyed offlineshop is from 2021.
some mates tell me i can use the offlineshop from sonitex but idk, other tell me i cant use thisdracaryx's was not recommended to me either
whats you oppinion, what offlineshop is great to use?
My support is actually closed, i closed the sellings (of any product) 1 year ago but i continued to give support to my clients in the last year, and few months ago i stopped even to give support. The shop was sold with 'free support' but 'free' != 'lifelong'. I consider Ikarus Shop v1 obsolete and i don't recommend to use it actually. I don't recommend the leaked one neither obv. It's life is basically ended.
It might happen that i will start to distribute a v1.5/v1.8 if I find someone I trust to help me to distribute it. My time is infinitesimal, so I could never start doing 2 installations per day again like I done in past.
In that case , it would be a much simpler service than it was in past. In the past I gave away a lot of stuff for free. Whoever changed files received free reinstallation, whoever installed new systems connected in some way with my shop received the free adjustment. Many things given to people who have not been able to appreciate nothing. So in the future I will only distribute the product and any security patches, nothing else.
-
Hi Guys,
I m pretty sure most of you perfectly know what i m meaning for "DEVIL TOWER LAG AFTER WARP", It's a critical FPS Drop which happen very often just after a warp in a dungeon.
I ve found the way to definitely fix it with a few lines short change.
Just to spend a few words for those who want to understand something before copying and pasting the fix here is the explanation of the bug:
HERE IS THE CODE:
-
The fix about duplication bug is free released right to know.
I don't understand why this story still turns.
If people like to use the leakered stuff and don't even bother to install the fix I released SEVERAL MONTHS AGO then saying around that my shop is bad seems a bit of a slander.
Bitte melden Sie sich an, um diesen Link zu sehen. <-- look at date
-
Hi guys,
There's a guy that is blackmailing all servers that are using my offlineshop.
Not just my clients, but also those who downloaded it from some idiot's leak.
I'm sharing the fix here as 60/70% of the servers currently open use my shop.
Code- //FILE : new_offlineshop_manager.cpp
- //SEARCH FOR
- bool CShopManager::RecvShopCreateOfferClientPacket(LPCHARACTER ch, TOfferInfo& offer)
- {
- if(!ch)
- return false;
- //offlineshop-updated 03/08/19
- if(ch->GetPlayerID() == offer.dwOwnerID)
- return false;
- //ADD UNDER
- // fix flooding offers
- if (!CheckOfferCooldown(ch->GetPlayerID()))
- return false;
- //SEARCH FOR:
- void CShopManager::ClearSearchTimeMap()
- {
- m_searchTimeMap.clear();
- //ADD UNDER
- // fix flooding offers
- m_offerCooldownMap.clear();
- //SEARCH FOR
- void CShopManager::ClearSearchTimeMap()
- {
- m_searchTimeMap.clear();
- }
- //ADD UNDER
- // fix flooding offers
- bool CShopManager::CheckOfferCooldown(DWORD dwPID) {
- DWORD now = get_dword_time();
- const DWORD cooldown_seconds = 15;
- itertype(m_offerCooldownMap) it = m_offerCooldownMap.find(dwPID);
- if (it == m_offerCooldownMap.end()) {
- m_offerCooldownMap[dwPID] = now + cooldown_seconds *1000;
- return true;
- }
- if (it->second > now)
- return false;
- it->second = now + cooldown_seconds * 1000;
- return true;
- }
- //FILE : new_offlineshop_manager.h
- //SEARCH FOR:
- //search time map (checking to avoid search abouse)
- void ClearSearchTimeMap();
- bool CheckSearchTime(DWORD dwPID);
- //ADD UNDER:
- // fix flooding offers
- bool CheckOfferCooldown(DWORD dwPID);
- //SEARCH FOR:
- AUCTIONMAP m_mapAuctions;
- //ADD UNDER:
- // fix flooding offers
- SEARCHTIMEMAP m_offerCooldownMap;
- //FILE : ClientManagerOfflineshop.cpp
- //SEARCH FOR:
- bool CClientManager::RecvOfflineShopOfferAccepted(const char* data)
- {
- offlineshop::TSubPacketGDOfferAccept* subpack;
- data = Decode(subpack, data);
- offlineshop::COfferCache::TOfferCacheInfo* pOffer=nullptr;
- m_offlineshopOfferCache.Get(subpack->dwOfferID,&pOffer);
- //ADD UNDER:
- if(!pOffer)
- return true;
Random User :
Why are u sharing it using Metin2downloads?
Answer:
I m bored to see this guy make money by blackmailing.
Random User part2:
Is it right to share this fix even with those who are not your customer?
Answer:
I honestly think that anyone who uses the shop without permission, taking it from sources different from me, is not worthy of help from me, however I can't even allow so many people to be fooled by this idiot boy.
Random User part3:
Do you know who is blackmailing the p.server founders?
Answer:
Yes, i know his discord account : Mădălin#2332
I recommend to don't pay him at all. I would like to know other accounts of this guy, if anyone know some please report to me.
I also have the proofs about what i m talking.
BIG DISCLAIMER:
Test the code on a test-sever before to move it on a live-server.
Thanks to VegaS for the tip about cooldown
-
if you are not using mailbox system, you need to remove the usage of IsOpenMailBox
-
I think they are both good.
Martysama's encryption is near to be sale again (v2)FoxFS
And about FoxFS.... i m sure Amnezia was joking.
It is broken and many tools (e.g. EterHook) give way to extract the whole pack with 3/4 clicks
-
Hello community,
I have always seen people go crazy for this problem which is solved with 2 lines of code, in particular with the various offlineshops (mine, or the free release great and ken) that are unfairly blamed for having duplication bugs. No!
I believe that if you warp a player on another core without performing any checks you can't blame those who made the other systems which are then used to take advantage of the vulnerability you caused.
If you implement something you need to make sure there are adequate checks to avoid causing vulnerabilities. In my opinion the cause of the duplication is not the various offlineshops, but the channel switcher which does not perform not even half checks before executing the warp.
Anyway, no more chatter.
I will explain here how to fix this problem.
-
You should post here something... it is not sufficient to show the screen of the bugs to make us think at a theory
-
Hi guys,
A guy reported to me a weird bug about shamans w/m which are skipping collision when they are too fast to attack.
On default source files it is still an unresolved bug which appear when the shaman's attack speed is more than 145/150.
here a video which show how it is not getting the damage text for each hit on the stone.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
here the fix:
-
was missing the file GrpObjectInstance.h in the repository, i've added it right now
-
There is a bug about the stealth of the assassin with buffs actived.
If the players near the assassin that is using the stealth move the camera zoom , the effects become visible again.
Bitte melden Sie sich an, um dieses Bild zu sehen.
source : myself
Sameone could need to add
#include "../UserInterface/Locale_inc.h"
at the beginning of the file source/EterBase/StdAfx.h
to include the defines in Locale_inc.h
------- EDIT ------
Due to some change on client-source someone may require a small fix to be added to this system: -
If I use licenses for my products, it is to prevent the worms with which this world is full from exploiting the work of others for personal revenues.
Licenses are also a protection of the customer, who will be happier to spend his money without what he buys is published one day for free .. It is not always possible to obtain this result but we do everything possible
-
I appreciate your work and i thank you for share.
I gues you would like to know that there are some big problems with this shop.
I took a quick look at this code, and I immediately noticed that you don't delete some objects pointed to every query you run and this causes memory leak. In short, you risk that in a very populated server the ram will end after a few hours.
I hope you will see this constructive criticism as an aid and not as an attack.
Regards
Maybe you can post some improvements here ?
I don't like posting correction code, it's not very respectful of who worked to make this release. If he read my advice I'm sure he can do an update to fix it.
-
bitteschön. Bitte melden Sie sich an, um diesen Link zu sehen.
I hope who will download and install it will solve the problems i said Bitte melden Sie sich an, um diesen Link zu sehen.
-
I appreciate your work and i thank you for share.
I gues you would like to know that there are some big problems with this shop.
I took a quick look at this code, and I immediately noticed that you don't delete some objects pointed to every query you run and this causes memory leak. In short, you risk that in a very populated server the ram will end after a few hours.
I hope you will see this constructive criticism as an aid and not as an attack.
Regards
-
it doesnt change the way to set the drop of the chest. It use tables only for setting the mob drop.
-
small code to apply to fix the problem of not starting the kill event (lua) after killing a monster that has set 0 as exp in his mob_proto.
Bitte melden Sie sich an, um diesen Link zu sehen.
bye bye
source : me
-
Such a tool is very cool.
But why no general Makefile in the Main-Directory of the source?
Then it's just the same: gmake db, gmake game, gmake all, gmake libs, gmake strip-game ....
Also gmake is already having a clock skew detection, so nothing additional needs to be implemented additonaly for that.
Thanks for sharing anyway, just giving you a hint, that this is already out there
you are right but i prefer work with python
anyway my "complete tool" on my machine give me way to make more actions (eg. compile offlineshop-library and put it on extern folder and other related things which there arent in the general gmake)
The clock detenction of gmake doesnt touch the file, this mean you have to compile the file every time if you dont touch the file, this tool touch the file if the last edit is in the future
-
I wrote this small tool in python to manage easly the server source in a unique script to run.
The tool is written in Python 2.7 but it should works fine with next version.
Basically, the tool can help you to build/touch/strip without navigate in the differents paths.
The tool can perform:
-Build:
build game/db
build game/db with clean
build game&db (consecutively)
build game&db with clean
-Touch (which dont' create new file when is used with a wrong name):
perform Touch of one or more files in game/src (by inserting the names separated with a space)
perform Touch of one or more files in db/src (by inserting the names separated with a space)
-Strip:
Strip game (by copying it)
Strip db (--same)
Additional features:
- the tool find if a file is edited $val seconds in the future (eg. if you have set a wrong date in your compiler) and it will touch the file automatically.
- the tool is written in procedural python (no OOP) so you should read easly it even if you are not an expert with python.
- You can run more than one commands in sequence by separating them with one of these character : ("&&","&","|"," ",'\t',"-",',') (es. : 1&9 -> build game and strip game)
- the tool can get command-line arguments to perform what you need (you could take a look under to know the command you can pass)
to-know:
- To run a script in python in the compiler you need to have installed Python (i recommend python27 which i can guarantee it will works). If you haven't installed python you can do it by using pkg manager (pkg install pyhon27) or ports (cd /usr/ports/lang/python27 && make config-recursive && make install clean)
- If you get some problem with the script you can post a comment in this thread to know the solution, anyway it should works perfectly with martysama source (most commonly used).
- To run the script you should give 7XX octal permission.
- To run the script you need to go at the same path where is the script and to use "./scriptname.py" to run it.
- If you are creating the scriptfile using notepad++ (or some external editor) is possible to have a problem about the EOL character (you have to set it on "Unix EOL").
- You have way to enable/disable the question "exit?" when the build fail
- To run the script you should put it on "Server" folder, when you can find game, db, common, etc.
For any kind of problems i recommend you to write a comment in this thread (instead of pm) because another user could get same problem and find here the solution.
i hope it would be usefull.
byebye
COMMANDLINE ARGUMENTS
--build-game
--build-db
--build-game-clean
--build-db-clean
--build-all
--build-all-clean
--touch-file-gamesrc
--touch-file-dbsrc
--strip-game
--strip-db
--strip-all
SCRIPT
Python- #!/usr/local/bin/python2.7
- import os
- import time
- import sys
- ENABLE_ASK_BEFORE_EXIT = False
- ENABLE_AUTOTOUCH = True
- def get_revision_filename(file):
- if os.path.isfile("__REVISION__"):
- line = open("__REVISION__","r").readline()
- return file + "_r" + line.strip()
- else:
- return file
- def check_last_edit(path):
- def check_last_edit_single_file(file):
- nowtime = time.time()
- lastedit = os.path.getmtime(file)
- if nowtime < lastedit:
- if ENABLE_AUTOTOUCH:
- touch_file("" , file)
- return
- ans = ""
- while ans == "":
- print("file [%s] has modified %s seconds in future. do you want to touch it or to change date?\nchoose:(touch/date/n)"%(file , int(lastedit-nowtime)))
- ans = raw_input().strip()
- if ans == 'n':
- break
- if ans == 'touch':
- touch_file("" , file)
- elif ans == 'date':
- print("enter date (YYYYMMDDHHMM):")
- mydate = raw_input().strip()
- res = os.system("date %s"%mydate)
- if not res in (0,512):
- print("cannot set datetime. try another option.")
- ans = ""
- continue
- nowtime = time.time()
- else:
- print("unknown answer [%s]"%ans)
- ans = ""
- #end of single file
- if path[-4:] != '/src' and path[-4:] != '\\src':
- path += "/src"
- common = "common"
- files = [path+"/"+file for file in os.listdir(path) if os.path.isfile(path+"/"+file)]
- files += [common+"/"+file for file in os.listdir(common) if os.path.isfile(common+"/"+file)]
- for file in files:
- check_last_edit_single_file(file)
- def ask_if_exit():
- if not ENABLE_ASK_BEFORE_EXIT:
- print("exit!")
- sys.exit()
- print("do you want to stop the script operations?y/n\n")
- ans = ""
- while ans == "":
- ans = raw_input().strip()
- if ans == 'y':
- sys.exit()
- return
- elif ans == 'n':
- return
- else:
- print("unknow answer [%s] , try again"%(ans))
- print("do you want to stop the script operations?y/n\n(press just 'y' or 'n')\n")
- ans = ""
- def close():
- print("bye bye")
- sys.exit()
- def run_os_command(cmd):
- try:
- res = os.system(cmd)
- if res:
- print("cannot run os command [%s] error %s"%(cmd,str(res)))
- ask_if_exit()
- return False
- except Exception ,e:
- print("an exception during run os command [%s] exception[%s]"%(cmd,str(e)))
- ask_if_exit()
- return False
- return True
- def strip_file(file):
- stripfile = file+"_s"
- sourcefile= get_revision_filename(file)
- if not os.path.isfile(file+"/"+sourcefile):
- print("cannot find source file [%s]"%(file+"/"+sourcefile))
- ans=""
- while ans == "":
- print("do you want to build it?y/n")
- ans = raw_input().strip()
- if ans == 'y':
- build_file(file)
- strip_file(file)
- return
- if ans == 'n':
- return
- else:
- print("unknown answer [%s] try again."%ans)
- ans = ""
- return
- if os.path.isfile("%s/%s"%(file,stripfile)):
- os.remove("%s/%s"%(file,stripfile))
- if not run_os_command("cp %s/%s %s/%s"%(file,sourcefile, file , stripfile)):
- return
- run_os_command("strip -s %s/%s"%(file,stripfile))
- def strip_db():
- strip_file("db")
- def strip_game():
- strip_file("game")
- def strip_all():
- strip_db()
- strip_game()
- def touch_file(dir , files = ""):
- if len(dir)>0 and dir[-1] != '\\' and dir[-1] != '/':
- dir += "/"
- if files != "":
- files = files.split(" ")
- for file in files:
- if not os.path.isfile(dir+file):
- print("cannot find the file required [%s]."%file)
- continue
- else:
- if not run_os_command("touch %s"%(dir + file)):
- print("cannot find the file required [%s]."%file)
- continue
- else:
- print("touched %s"%file)
- else:
- print("the path [%s] will automatically added to the file path\nyou can use a space to separate the names to touch more one file"%(dir))
- ans = ""
- while ans == "":
- print("enter the names of the files (exit to exit):")
- ans = raw_input().strip()
- if ans == 'exit':
- print("You didn't touch any file.")
- ask_if_exit()
- return
- files = ans.split(' ')
- for file in files:
- if not os.path.isfile(dir+file):
- print("cannot find the file required [%s]."%file)
- if len(files) == 1:
- ans = ""
- continue
- else:
- if not run_os_command("touch %s"%(dir + file)):
- print("cannot find the file required [%s]."%file)
- if len(files) == 1:
- ans = ""
- continue
- else:
- print("touched %s"%file)
- def touch_in_db_src():
- touch_file("db/src")
- def touch_in_game_src():
- touch_file("game/src")
- def build_all():
- build_game()
- build_db()
- def build_all_clean():
- build_game_clean()
- build_db_clean()
- def build_file(file):
- check_last_edit(file)
- cmd = "cd %s/src && gmake && cd ../../"%file
- if not run_os_command(cmd):
- return
- output=get_revision_filename("%s/%s"%(file,file))
- if os.path.isfile(output):
- print("build %s successful."%output)
- else:
- print("cannot build file %s."%output)
- ask_if_exit()
- def build_game():
- build_file("game")
- def build_db():
- build_file("db")
- def clean_build(file):
- return run_os_command("cd %s/src && gmake clean && cd ../../"%file) == True
- def build_clean(file):
- if not clean_build(file):
- ask_if_exit()
- else:
- print("%s cleaned"%file)
- build_file(file)
- def build_db_clean():
- build_clean("db")
- def build_game_clean():
- build_clean("game")
- EVENTS = {
- 1: {
- "name" : "BUILD GAME",
- "event": build_game,
- "cmd" : "--build-game",
- },
- 2: {
- "name" : "BUILD DB",
- "event": build_db,
- "cmd" : "--build-db",
- },
- 3: {
- "name" : "BUILD GAME CLEAN",
- "event": build_game_clean,
- "cmd" : "--build-game-clean",
- },
- 4: {
- "name" : "BUILD DB CLEAN",
- "event": build_db_clean,
- "cmd" : "--build-db-clean",
- },
- 5:{
- "name" : "BUILD ALL",
- "event": build_all,
- "cmd" : "--build-all",
- },
- 6: {
- "name" : "BUILD ALL CLEAN",
- "event": build_all_clean,
- "cmd" : "--build-all-clean",
- },
- 7: {
- "name" : "TOUCH FILE IN game/src",
- "event": touch_in_game_src,
- "cmd" : "--touch-file-gamesrc",
- },
- 8: {
- "name" : "TOUCH FILE db/src",
- "event": touch_in_db_src,
- "cmd" : "--touch-file-dbsrc",
- },
- 9:{
- "name" : "STRIP GAME",
- "event": strip_game,
- "cmd" : "--strip-game",
- },
- 10:{
- "name" : "STRIP DB",
- "event": strip_db,
- "cmd" : "--strip-db",
- },
- 11:{
- "name" : "STRIP ALL",
- "event": strip_all,
- "cmd" : "--strip-all",
- },
- 0:{
- "name" : "CLOSE",
- "event": close,
- "cmd" : "--close",
- },
- }
- def print_commandlist():
- print("What do you want to do?\n")
- toprint = [ (EVENTS[key]["name"],str(key)) for key in EVENTS]
- for thing in toprint: print("%s.\t%s"%(thing[1],thing[0]))
- def do_cmd(cmd):
- key = int(cmd)
- if not key in EVENTS:
- print("Unknown command [%d] (ignored)\n")
- return
- print("executing [%s]..."%(EVENTS[key]["name"]))
- event = EVENTS[key]["event"]
- event()
- def is_right_ans(ans):
- andchar = ("&&","&","|"," ",'\t',"-",',')
- return len([char for char in ans if not char in andchar and not char.isdigit()]) == 0
- def do_commands(cmdstr):
- andchar = ("&&","&","|"," ",'\t',"-",',')
- cmdlist = [cmdstr]
- tmp = []
- for char in andchar:
- for cmd in cmdlist:
- tmp = list(cmdlist)
- cmdlist = []
- for part in tmp:
- cmdlist+= part.split(char)
- wrong = [cmd for cmd in cmdlist if not cmd.isdigit()]
- if len(wrong) != 0:
- print("found wrong command/commands [%s] (ignored)."%str(wrong))
- for cmd in cmdlist:
- if cmd in wrong:
- continue
- do_cmd(cmd)
- def main():
- if len(sys.argv) > 1:
- cmdargs = [ (EVENTS[key]["cmd"] , key) for key in EVENTS]
- listofargs = [value["cmd"] for value in EVENTS.values()]
- wrongargs = [arg for arg in sys.argv if not arg in listofargs and arg != sys.argv[0]]
- if len(wrongargs) != 0:
- print("wrong args [%s] ignored."%(str(wrongargs)))
- for cmdarg in cmdargs:
- if cmdarg[0] in sys.argv and not cmdarg[0] in wrongargs:
- do_cmd(cmdarg[1])
- return
- print_commandlist()
- ans = ""
- while ans == "":
- ans = raw_input().strip()
- if not is_right_ans(ans):
- print("wrong input command.")
- print_commandlist()
- ans = ""
- do_commands(ans)
- if __name__ == "__main__":
- main()