Jump to content

Problem with quests or liblua


Recommended Posts

Hello guys, I have a very complicated problem to explain, and the most complicated way to solve.
I'm using leaked marty files as a base. (Yes, I texted him to try to buy the current files and he never answered me.)

So let's go to the problem, first I took the source, fixed some fixes, installed some systems. I also updated to use Clang, and all dependencies as static. That's basically what I did.

 

Now the problem comes, I noticed that in the blacksmith NPC of the demon tower every time I clicked on it, and then closed the conversation, it presented this error in the syserr


When I click "Close" it generates this error.

spacer.png

spacer.png

 

And when I click "Cancel" it generates this error.

spacer.png

spacer.png


Here's the quest I'm using

Spoiler


quest deviltower_zone begin
    state start begin
        when login begin
            if pc.get_map_index() == 66 then
                if pc.get_x() < 2048+88 or pc.get_y() < 6656+577 or pc.get_x() > 2048+236 or pc.get_y() > 6656+737 then
                    pc.warp((5376+532)*100, (512+596+4)*100, 65)
                end
            pc.set_warp_location(65, 5376+532, 512+596+4)
            elseif pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 then
                pc.set_warp_location(65, 5376+532, 512+596+4)
            end
        end

        when logout begin
            if pc.count_item(30300) >= 1 then
                pc.remove_item(30300, pc.count_item(30300))
            end
            if pc.count_item(30302) >= 1 then
                pc.remove_item(30302, pc.count_item(30302))
            end
        end
            
        when 20348.chat.locale.deviltower_zone._10_npcChat begin
            if pc.get_level() < 40 then
                say_title(locale.say_title, npc.get_name0())
                say(locale.deviltower_zone._30_say)
            else
                say_title(locale.say_title, npc.get_name0())
                say(locale.deviltower_zone._40_say)
                local s =  select(locale.enter, locale.no)
                if s == 1 then
                    pc.warp(216500,727000)
                end
            end
        end

        when 8015.kill begin
            notice_multiline(locale.deviltower_zone.say01,notice_in_map)
            timer("devil_stone1_1", 6)
        end

        when devil_stone1_1.timer begin
            d.new_jump_all(66, special.devil_tower[1][1], special.devil_tower[1][2])
            d.regen_file("data/dungeon/deviltower2_regen.txt")
            d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[2][1], special.devil_tower[2][2], "data/dungeon/deviltower3_regen.txt")
        end

        when 1091.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            notice_multiline(locale.deviltower_zone.say02,d.notice)
            d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[3][1], special.devil_tower[3][2], "data/dungeon/deviltower4_regen.txt")
            d.check_eliminated()
        end

        function get_4floor_stone_pos()
            local positions = 
                {
                    {368, 629}, {419, 630}, {428, 653}, {422, 679},
                    {395, 689}, {369, 679}, {361, 658},
            }
            for i = 1, 6 do
                local j = number(i, 7)
                if i != j then
                    local t = positions[i];
                    positions[i] = positions[j];
                    positions[j] = t;
                end
            end
            return positions
        end

        when 8016.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            d.setf("level", 4)
            local positions = deviltower_zone.get_4floor_stone_pos()

            for i = 1, 6 do
                test_chat(positions[i][1], positions[i][2])
                d.set_unique("fake" .. i , d.spawn_mob(8017, positions[i][1], positions[i][2]))
            end

            test_chat(positions[7][1], positions[7][2])

            local vid = d.spawn_mob(8017, positions[7][1], positions[7][2])
            test_chat(vid)
            d.set_unique("real", vid)
            server_loop_timer('devil_stone4_update', 5, pc.get_map_index())
            server_timer('devil_stone4_fail1', 5*60, pc.get_map_index())        
            notice_multiline(locale.deviltower_zone._50_dNotice,d.notice)        
        end

        when devil_stone4_fail1.server_timer begin
            if d.select(get_server_timer_arg()) then
                notice_multiline(locale.deviltower_zone._60_dNotice,d.notice)
                server_timer('devil_stone4_fail2', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone4_fail2.server_timer begin
            if d.select(get_server_timer_arg()) then
                notice_multiline(locale.deviltower_zone._70_dNotice,d.notice)
                server_timer('devil_stone4_fail', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone4_fail.server_timer begin
            if d.select(get_server_timer_arg()) then
                notice_multiline(locale.deviltower_zone._80_dNotice,d.notice)
                d.clear_regen()
                d.exit_all()
                clear_server_timer('devil_stone4_update', get_server_timer_arg())
            end
        end

        when devil_stone4_update.server_timer begin
            if d.select(get_server_timer_arg()) then
                if not d.is_unique_dead("real") then
                    for i = 1, 6 do
                        if d.getf("fakedead" .. i) == 0 then
                            if d.is_unique_dead("fake" .. i) then
                                notice_multiline(locale.deviltower_zone._90_dNotice,d.notice)
                                d.setf("fakedead" .. i, 1)                                
                            else
                                if d.unique_get_hp_perc("fake" .. i) < 50 then
                                    d.purge_unique("fake" .. i)
                                    d.setf("fakedead" .. i, 1)
                                    notice_multiline(locale.deviltower_zone._90_dNotice,d.notice)
                                end    
                            end
                        end
                    end
                else
                    server_timer("devil_stone4_end", 5, get_server_timer_arg())
                    d.purge()
                    notice_multiline(locale.deviltower_zone._100_dNotice,d.notice)
                    clear_server_timer('devil_stone4_fail1', get_server_timer_arg())
                    clear_server_timer('devil_stone4_fail2', get_server_timer_arg())
                    clear_server_timer('devil_stone4_fail', get_server_timer_arg())
                end
            else
                server_timer('devil_stone4_stop_timer', 1, get_server_timer_arg())
            end
        end

        when devil_stone4_stop_timer.server_timer begin
            clear_server_timer('devil_stone4_update', get_server_timer_arg())
        end

        when devil_stone4_end.server_timer begin
            if d.select(get_server_timer_arg()) then
                clear_server_timer('devil_stone4_update', get_server_timer_arg())
                clear_server_timer('devil_stone4_fail1', get_server_timer_arg())
                clear_server_timer('devil_stone4_fail2', get_server_timer_arg())
                clear_server_timer('devil_stone4_fail', get_server_timer_arg())
                
                d.clear_regen()
                
                d.setf("level", 5)
                d.setf("stone_count", 5)
                notice_multiline(locale.deviltower_zone._110_dNotice,d.notice)
                d.jump_all(special.devil_tower[4][1], special.devil_tower[4][2])
                server_timer('devil_stone5_fail1', 5*60, get_server_timer_arg())
                clear_server_timer('devil_stone4_update', get_server_timer_arg())

                d.set_regen_file("data/dungeon/deviltower5_regen.txt")

                d.spawn_mob(20073, 421, 452)
                d.spawn_mob(20073, 380, 460)
                d.spawn_mob(20073, 428, 414)
                d.spawn_mob(20073, 398, 392)
                d.spawn_mob(20073, 359, 426)
            end
        end
        when devil_stone5_fail1.server_timer begin
            if d.select(get_server_timer_arg()) then
                notice_multiline(locale.deviltower_zone._120_dNotice,d.notice)
                server_timer('devil_stone5_fail2', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone5_fail2.server_timer begin
            if d.select(get_server_timer_arg()) then
                notice_multiline(locale.deviltower_zone._60_dNotice,d.notice)
                server_timer('devil_stone5_fail3', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone5_fail3.server_timer begin
            if d.select(get_server_timer_arg()) then
                notice_multiline(locale.deviltower_zone._70_dNotice,d.notice)
                server_timer('devil_stone5_fail', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone5_fail.server_timer begin
            if d.select(get_server_timer_arg()) then
                notice_multiline(locale.deviltower_zone._80_dNotice,d.notice)
                d.exit_all()
            end
        end


        when 1062.kill with pc.in_dungeon() and d.getf("level") == 5 begin
            local KILL_COUNT_FOR_DROP_KEY = 50
            local n =d.getf("count") + 1
            d.setf("count", n) 
            if n == KILL_COUNT_FOR_DROP_KEY then
                game.drop_item(50084, 1)
                d.setf("count", 0)
            end
        end

        when 20073.take with item.vnum == 50084 begin
            npc.purge()
            item.remove()
            d.setf("stone_count", d.getf("stone_count") - 1)
            if d.getf("stone_count") <= 0 then
                d.setf("level", 6)
                d.clear_regen()
                d.regen_file("data/dungeon/deviltower6_regen.txt")

                notice_multiline(locale.deviltower_zone._130_dNotice,d.notice)
                d.jump_all(special.devil_tower[5][1], special.devil_tower[5][2])
                local server_arg = d.get_map_index()
                clear_server_timer('devil_stone5_fail1', server_arg)
                clear_server_timer('devil_stone5_fail2', server_arg)
                clear_server_timer('devil_stone5_fail3', server_arg)
                clear_server_timer('devil_stone5_fail', server_arg)
            else
                d.notice(string.format(locale.deviltower_zone._140_dNotice, d.getf("stone_count")))
            end
        end

        when 1092.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and d.getf("level") == 6 begin
            d.kill_all()
            d.check_eliminated()
            notice_multiline(locale.deviltower_zone._160_dNotice,d.notice)
            local reward_alchemist = {20074, 20075, 20076}
            d.spawn_mob(reward_alchemist[number(1,3)], 425, 216);
            d.setqf2("deviltower_zone","can_refine", 1)
        end


        when 20074.chat.locale.deviltower_zone._170_npcChat with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.lock() begin
            say_title(locale.say_title, npc.get_name0())
            say(locale.deviltower_zone._190_say)
            wait()
            if pc.level >=75 then
                say_title(locale.say_title, npc.get_name0())
                say(locale.deviltower_zone._200_say)
                local s= select(locale.deviltower_zone._210_select, locale.deviltower_zone._220_select, locale.cancel)
                if s==2 then
                    pc.warp(590500, 110900)
                    return
                end	
                if s==3 then
                    return
                end
                timer("devil_jump_7", 6)
                npc.unlock()
                d.purge()
                return
            end
            say_title(locale.say_title, npc.get_name0())
            say(locale.deviltower_zone._230_say)
            wait()
            pc.warp(590500, 110500)
            return
        end

        when 20075.chat.locale.deviltower_zone._170_npcChat with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.lock() begin
            say_title(locale.say_title, npc.get_name0())
            say(locale.deviltower_zone._190_say)
            wait()
            if pc.level >=75 then
                say_title(locale.say_title, npc.get_name0())
                say(locale.deviltower_zone._200_say)
                local s= select(locale.deviltower_zone._210_select, locale.deviltower_zone._220_select, locale.cancel)
                if s==2 then
                    pc.warp(590500, 110900)
                    return
                end	
                if s==3 then
                    return
                end	
                timer("devil_jump_7", 6)
                npc.unlock()
                d.purge()
                return
            end
            say_title(locale.say_title, npc.get_name0())
            say(locale.deviltower_zone._230_say)
            wait()
            pc.warp(590500, 110500)
            return
        end
        
        when 20076.chat.locale.deviltower_zone._170_npcChat with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.lock() begin
            say_title(locale.say_title, npc.get_name0())
            say(locale.deviltower_zone._190_say)
            wait()
            if pc.level >=75 then
                say_title(locale.say_title, npc.get_name0())
                say(locale.deviltower_zone._200_say)
                local s= select(locale.deviltower_zone._210_select, locale.deviltower_zone._220_select, locale.cancel)
                if s==2 then
                    pc.warp(590500, 110900)
                    return
                end	
                if s==3 then
                    return
                end	

                timer("devil_jump_7", 6)
                npc.unlock()
                d.purge()
                return
            end
            say_title(locale.say_title, npc.get_name0())
            say(locale.deviltower_zone._230_say)
            wait()
            pc.warp(590500, 110500)
            return
        end
        when devil_jump_7.timer begin
            d.clear_regen()
            d.spawn_mob(8018, 639, 658)
            d.spawn_mob(8018, 611, 637)
            d.spawn_mob(8018, 596, 674)
            d.spawn_mob(8018, 629, 670)

            d.setf("level", 7)

            notice_multiline(locale.deviltower_zone._240_dNotice,d.notice)
            d.jump_all(2048+590, 6656+638)
        end

        when 8018.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            local cont = d.getf("7_stone_kill") + 1
            d.setf("7_stone_kill", cont)

            if cont >= 4 then
                d.setf("7_stone_kill", 0)
                d.set_regen_file("data/dungeon/deviltower7_regen.txt")
            end	
        end

        when 8019.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            game.drop_item(30300, 1)
        end

        when 30300.use with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            pc.remove_item("30300", 1)

            local pct = number(1,10)

            if pct == 1 then
                game.drop_item(30302, 1)
                d.clear_regen()
            else
                -- nothing happens cause the items isnt used in the game
                -- game.drop_item(30301, 1)
            end
        end

        when 30302.use with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            if d.getf( "level" ) != 7 then
                pc.remove_item( "30302", 1)
                return
            end
                
            say_title(locale.say_title, npc.get_name0())
            say(locale.deviltower_zone._250_say)
            pc.remove_item("30302", 1)
            timer("devil_jump_8", 6)
            d.clear_regen()
        end

        when devil_jump_8.timer begin
            d.setf("level", 8)
            notice_multiline(locale.deviltower_zone._260_dNotice,d.notice)
            d.jump_all(2048+590, 6656+403)
            d.set_regen_file("data/dungeon/deviltower8_regen.txt")
            d.spawn_mob(20366, 640, 460)
            local _count = pc.count_item(30302)
            pc.remove_item(30302,_count)
            
        end

        when 1040.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            local pct1 = number(1, 5)
            if pct1 == 1 then
                local pct2 = number(1, 10)
                if pct2 == 1 then
                    game.drop_item(30304, 1)
                else
                    game.drop_item(30303, 1)
                end
            else
                return
            end
        end

        when 20366.take with item.vnum == 30304 begin
            notice_multiline(locale.deviltower_zone.say04,d.notice)
            npc.purge()
            item.remove()
            timer("devil_jump_9", 6)
        end

        when devil_jump_9.timer begin
            d.setf("level", 9)

            notice_multiline(locale.deviltower_zone._270_dNotice,d.notice)
            d.jump_all(2048+590, 6656+155)
            d.regen_file("data/dungeon/deviltower9_regen.txt")
        end

        when 1093.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            d.kill_all()
            d.setqf2("deviltower_zone","9_done", 1)
            notice_multiline(locale.deviltower_zone._280_dNotice,d.notice)
            notice_multiline(locale.deviltower_zone._290_dNotice,d.notice)
            server_timer("devil_end_jump", 60, d.get_map_index())
        end

        when devil_end_jump.server_timer begin
            if d.select (get_server_timer_arg()) then
                d.clear_regen()
                d.exit_all()
            end
        end
    end
end

 



 

And what I noticed that is generating this syserr is "npc.lock()"
If I remove this npc.lock() from the line

when 20075.chat.locale.deviltower_zone._170_npcChat with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.lock() begin

The errors stop.




I also posted my Makefile that I made myself, even though I didn't have much sense of C and Makefiles

Spoiler


CXX	= clang++
DBGBIN = ../../server/share/bin/gamed
RELBIN = ../../server/share/bin/game

# default flags
CFLAGS  = -m32 -Wall -O2 -pipe -D_THREAD_SAFE -std=c++1z -stdlib=libc++ -msse2 -mssse3 -Wno-invalid-source-encoding -fexceptions -static

# debug
CFLAGS_DBG = $(CFLAGS)
CFLAGS_DBG += -g3 -O0 -ggdb -DNDEBUG

# release
CFLAGS_REL = $(CFLAGS)
CFLAGS_REL += -g -Os

# default variables
LIBS = -lcryptopp -llzo2
INCDIR = -I/usr/local/include -I../libs -I../resources/
LIBDIR = -L/usr/local/lib

# libthecore libs and includes
INCDIR += -I../libs/libthecore/src
LIBDIR += -L../libs/libthecore/lib
LIBS   += -lthecore

# libgame libs and includes
INCDIR += -I../libs/libgame/src
LIBDIR += -L../libs/libgame/lib
LIBS   += -lgame

# libsql libs and includes
INCDIR += -I../libs/libsql/src
LIBDIR += -L../libs/libsql/lib
LIBS   += -lsql

# libpoly libs and includes
INCDIR += -I../libs/libpoly/src
LIBDIR += -L../libs/libpoly/lib
LIBS   += -lpoly

# liblua libs and includes
INCDIR += -I../libs/liblua/include
LIBDIR += -L../libs/liblua/lib
LIBS   += -llua -llualib

# MySQL
INCDIR += -I/usr/local/include/mysql
LIBDIR += -L/usr/local/lib/mysql
LIBS += -lmysqlclient -lz

# OpenSSL
LIBS += -lssl -lcrypto

# pthread
LIBS += -pthread -lm -lmd

# DevIL
LIBS += -lIL -lpng -ltiff -lmng -llcms -ljpeg -ljbig -llzma

CPP_FILES := $(wildcard src/*.cpp)
OBJ_FILES_REL := $(addprefix .obj/release/,$(notdir $(CPP_FILES:.cpp=.o)))
OBJ_FILES_DBG := $(addprefix .obj/debug/,$(notdir $(CPP_FILES:.cpp=.o)))

$(shell if [ ! -d ../bin ]; then mkdir ../bin; fi)
$(shell if [ ! -d .obj/release ]; then mkdir -p .obj/release; fi)
$(shell if [ ! -d .obj/debug ]; then mkdir -p .obj/debug; fi)

default: release
debug: $(DBGBIN)
release: $(RELBIN)
all: $(DBGBIN) $(RELBIN)

$(RELBIN): $(OBJ_FILES_REL)
	@echo -e "\e[32mlinking\e[39m $(RELBIN)"
	@$(CXX) $(CFLAGS_REL) $(LIBDIR) $(OBJ_FILES_REL) $(LIBS) -o $(RELBIN)

$(DBGBIN): $(OBJ_FILES_DBG)
	@echo -e "\e[32mlinking\e[39m $(DBGBIN)"
	@$(CXX) $(CFLAGS_DBG) $(LIBDIR) $(OBJ_FILES_DBG) $(LIBS) -o $(DBGBIN)

.obj/release/%.o: src/%.cpp
	@echo -e "\e[94mCompiling\e[39m $<"
	@$(CXX) $(CFLAGS_REL) $(INCDIR) -c $< -o $@

.obj/debug/%.o: src/%.cpp
	@echo -e "\e[94mCompiling\e[39m $<"
	@$(CXX) $(CFLAGS_DBG) $(INCDIR) -c $< -o $@

clean:
	rm -rf .obj
	rm -f $(RELBIN)
	rm -f $(DBGBIN)

dep:
	touch src/Depend
	$(CXX) $(INCDIR) -MM src/*.cpp > src/Depend

sinclude src/Depend

 

 

I would be very grateful if anyone can help me with this problem. 😁😆

Edited by Metin2 Dev
Core X - External 2 Internal
Link to comment
Share on other sites

  • Replies 1
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

Top Posters In This Topic

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Announcements



  • Similar Content

  • Activity

    1. 60

      Inbuild GR2 Animation

    2. 2

      wait() function bug

    3. 0

      Remove Party Role Bonuses

    4. 1

      Fix CBar3D

    5. 2

      set_quest_state not working

    6. 1

      Fix CBar3D

  • Recently Browsing

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.