Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Quest wpisujący dane do MySQL


Rekomendowane odpowiedzi

Opublikowano

Postaram się jak najdokładniej opisać co bym chciał.

W navicat po otwarciu(folderu/zakładki, nie wiem jak to określić) "player" mam tabelę o nazwie "boss_quest".

Tabela ma 4 kolumny: "mob_id", "ilość", "potrzeba" "nagroda".

Kolumny "mob_id", "potrzeba" i "nagroda" będą miały stałą niezmienną wartość, "nagroda" będzie miała wartość początkową 0.

załóżmy że kolumna bedzie wygladac tak:

mob_id  ilość  potrzeba  nagroda
 101      0      100      9998
 102      0      200      9999

Quest będzie miał za zadanie:

Gdy zostanie zabty 1 mob o id 101, quest dodaje do kolumny "ilość" wartość +1 (czyli jak bedzie 50 to dodaje 1 i jest 51, jak bedzie 56+1=57).

Następnie quest sprawdza czy ilość = potrzeba, jeżeli tak to daje nagrodę o id 9998 i ustala "ilość" na 0.

Quest nie ma się kończyć( nie ma być jednorazowy, w przypadku powodzenia warunku ilość= potrzeba nie ma sie konczyc).

Nie jest to trudne zadanie, najchętniej sam bym to zrobił, ale nie wiem jakich funkcji dokladnie uzyc aby pobierac i dodawac dane do mysql.

 

narazie mam takie cos

quest boss_quest begin
	state start begin
		when 101.kill begin  --gdy zabijemy psa quest sie rozpoczyna, zmienie na inny warunek aby nie bugowalo moba
			local wartosc1 = 1  --wartosc jaka ma zostac dodana po zabiciu
			query("UPDATE player.boss_quest SET wartosc=wartosc+"..wartosc1.." WHERE mob_id='"..pc.get_mob().."';") --dodanie wartosci wg. kolumny mob_id gdzie mob_id to id moba
			chat("Wlasnie zabiles dzikiego psa, zostal dodany 1 punkt")
		end
	end
end

dalej nie wiem niestety

Opublikowano

Zrobiłeś, że ma wysyłać jakieś zapytania do mysql gdy zabije się psa, a ty chcesz, że jak dostanie się nagrode, to to cholerstwo wraca do punktu 0?

Opublikowano

Dawno nie pisalem questow, z rok temu (a potrafilem na prawde wiele), cos mi sie pomylilo, nie moglem po prostu sobie przypomniec funkcji i wpisalem tak dla przykladu, proszę mnie nie pouczać.

 

@Edit

 

Zrobiłeś, że ma wysyłać jakieś zapytania do mysql gdy zabije się psa, a ty chcesz, że jak dostanie się nagrode, to to cholerstwo wraca do punktu 0?

Nie rozpoczalem tylko questa, ale chcialbym zeby bylo:

zabicie psa->dodanie punktu do bazy przy odpowiednim mobie->sprawdzenie warunku->danie nagrody->zmniejszenie wartosci do 0

 

Tak trudno zrozumiec z 1 posta?

Opublikowano

O to Ci chodziło?

quest boss_quest begin
	state start begin
		when kill with npc.get_race() == 101 begin
			local kill = 101
			local ilosc = query("SELECT player.boss_quest FROM ilosc WHERE mob_id='"..kill.."';")
			local potrzeba = query("SELECT player.boss_quest FROM potrzeba WHERE mob_id='"..kill.."';")
			local nagroda = query("SELECT player.boss_quest FROM nagroda WHERE mob_id='"..kill.."';")
			if ilosc => potrzeba then
				query("UPDATE player.boss_quest SET ilosc='0' WHERE mob_id='"..kill.."';")
				pc.give_item2(nagroda, 1)
				chat("Zabiłeś 100 psów!")
			else
				query("UPDATE player.boss_quest SET ilosc=ilosc+1 WHERE mob_id='"..kill.."';")
				chat("Zabiłeś jednego psa!")
			end
		end
	end
end

mob_id = id moba

ilosc = ile zabiliśmy mobów aktualnie

potrzeba = ile potrzeba zabic mobow by otrzymac nagrode

nagroda = id nagrody

Opublikowano

Wyglada ok, chcialbym aby po zabiciu kazdego moba wyswietlalo info ile jest punktow. Czy wystarczy nad pierwszym endem dodac

chat("Obecnie masz "..ilosc.." punktów za zabicie dzikiego psa. ")

?

Opublikowano

Zmienilem troche questa na taki.

quest boss_quest begin
    state start begin
        when kill with npc.get_race() == 1095 begin
            local kill = 1095
            local ilosc = query("SELECT player.boss_quest FROM ilosc WHERE mob_id='"..kill.."';")
            local potrzeba = query("SELECT player.boss_quest FROM potrzeba WHERE mob_id='"..kill.."';")
            local nagroda = query("SELECT player.boss_quest FROM nagroda WHERE mob_id='"..kill.."';")
            if ilosc => potrzeba then
                query("UPDATE player.boss_quest SET ilosc='0' WHERE mob_id='"..kill.."';")
                pc.give_item2(nagroda, 1)
                say("Caly serwer zabil 10 niebieskich smierci")
say("Wszyscy zalogowani otrzymaja nagrode. ")
            else
                query("UPDATE player.boss_quest SET ilosc=ilosc+1 WHERE mob_id='"..kill.."';")
                chat("Obecnie masz "..ilosc.." punktow za zabicie niebieskiej smierci. Potrzebujesz "..potrzeba.." ")
            end
        end
    end
end

wywalilo

syntax error : [string "startnpc . get_race ( ) == 1095"]:5: 'then' expected near '='
boss_quest.quest:17:Abort (core dumped)

błąd składni, nie może być "=" obok then, no ale ja tu problemu nie widze... ??

 

@Edit

poprawione, zamiast ">=" było "=>"

 

@Edit2

Quest sie wgral alenie dziala, po zabiciu moba nic sie nie wyswietla, nie dodaje danych do navi.

w konsoli VB wywala:

ERROR 1046 (3D000) at line 1: No database selected
ERROR 1046 (3D000) at line 1: No database selected
ERROR 1046 (3D000) at line 1: No database selected

Edit3

Po zianie chmod na 777 w filezilli wywalilo takie cos:

Jul 5 04:20:16 sendmail[1366]: s652KGYT001366: Losing ./qfs652KGYT001366: save mail panic
Jul 5 04:20:16 sendmail[1366]: s652KGYT001366: SYSERR(root): savemail: cannot save rejected email anywhere
ERROR 1046 (3D000) at line 1: No database selected
ERROR 1046 (3D000) at line 1: No database selected
ERROR 1046 (3D000) at line 1: No database selected
Opublikowano

sprawdź dokładnie czy tabelki w bazie danych są takie same jak w quescie oraz czy nie są crashowane

 

mam rozumieć, że tabela boss_quest jest w bazie player?

Opublikowano

Wszystkie kolumny są takie same jak w quescie: mob_id, ilosc, potrzeba, nagroda.

Primary key na mob_id.

Chmody 777.

Tabelki naprawione.

 

Nie wiem co jest źle :/

Opublikowano

sprawdź czy w questlib jest okej funkcja query, bo quest nie może połączyć się przez wytyczne do mysql, a dokładniej wyznaczonych tabeli

Opublikowano

funkcja query w questlib

function query(sql)
	user = "mt2"
	pw = "mt2!@#"
	local var = {}
	var.pre = ''
	if user ~= nil then
		var.pre = var.pre..' -u'..user
	end
	if pw ~= nil then
		var.pre = var.pre..' -p'..pw
	end
	var.scriptfile = 'sc_'..pc.get_name()..number(1,999)..number(2,999)..number(3,999)
	var.outputfile = 'op_'..pc.get_name()..number(1,999)..number(2,999)..number(3,999)
	sql = string.gsub(sql,'"',"'")
	var.str = "/usr/local/bin/mysql -N -L "..var.pre.." < "..var.scriptfile.." > "..var.outputfile
	script = io.open(var.scriptfile,"a+")
	script:write(sql)
	script:close()
	os.execute(var.str)
	back = io.open(var.outputfile)
	quer = back:read()
	back:flush()
	back:close()
	os.remove(var.scriptfile)
	os.remove(var.outputfile)
	return quer
end

varchar ustawione dla kazdej kolumny

CREATE TABLE `boss_quest` (
  `mob_id` varchar(11) NOT NULL,
  `ilosc` varchar(255) NOT NULL,
  `potrzeba` varchar(50) NOT NULL,
  `nagroda` varchar(15) NOT NULL,
  PRIMARY KEY (`mob_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Opublikowano

SELECT player.boss_quest FROM ilosc

SELECT player.boss_quest FROM potrzeba

SELECT player.boss_quest FROM nagroda

 

Gratuluje geniuszu.

 

http://wklej.to/ZGlMO
Opublikowano

Postaram się jak najdokładniej opisać co bym chciał.

W navicat po otwarciu(folderu/zakładki, nie wiem jak to określić) "player" mam tabelę o nazwie "boss_quest".

Tabela ma 4 kolumny: "mob_id", "ilość", "potrzeba" "nagroda".

Kolumny "mob_id", "potrzeba" i "nagroda" będą miały stałą niezmienną wartość, "nagroda" będzie miała wartość początkową 0.

załóżmy że kolumna bedzie wygladac tak:

mob_id  ilość  potrzeba  nagroda
 101      0      100      9998
 102      0      200      9999

Quest będzie miał za zadanie:

Gdy zostanie zabty 1 mob o id 101, quest dodaje do kolumny "ilość" wartość +1 (czyli jak bedzie 50 to dodaje 1 i jest 51, jak bedzie 56+1=57).

Następnie quest sprawdza czy ilość = potrzeba, jeżeli tak to daje nagrodę o id 9998 i ustala "ilość" na 0.

Quest nie ma się kończyć( nie ma być jednorazowy, w przypadku powodzenia warunku ilość= potrzeba nie ma sie konczyc).

Nie jest to trudne zadanie, najchętniej sam bym to zrobił, ale nie wiem jakich funkcji dokladnie uzyc aby pobierac i dodawac dane do mysql.

 

narazie mam takie cos

quest boss_quest begin
	state start begin
		when 101.kill begin  --gdy zabijemy psa quest sie rozpoczyna, zmienie na inny warunek aby nie bugowalo moba
			local wartosc1 = 1  --wartosc jaka ma zostac dodana po zabiciu
			query("UPDATE player.boss_quest SET wartosc=wartosc+"..wartosc1.." WHERE mob_id='"..pc.get_mob().."';") --dodanie wartosci wg. kolumny mob_id gdzie mob_id to id moba
			chat("Wlasnie zabiles dzikiego psa, zostal dodany 1 punkt")
		end
	end
end

dalej nie wiem niestety

Robisz serwer 2,5 roku i nie umiesz napisać questa ? Serio ?

Opublikowano

zależało by mi aby wszyscy dostali nagrodę, czy mogę do tego użyć funkcji

oxevent.give_item

Jest wgl funkcja dajaca item wszystkim?

 

@ edit

quest ogolnie dziala, teraz wyglada tak

quest boss_quest begin
	state start begin
		when kill with npc.get_race() == 1095 begin
			local ilosc = tonumber(query("SELECT ilosc FROM player.boss_quest WHERE mob_id = '"..npc.get_race().."';"))
			local potrzeba = tonumber(query("SELECT potrzeba FROM player.boss_quest WHERE mob_id = '"..npc.get_race().."';"))
			if ilosc >= potrzeba then
				query("UPDATE player.boss_quest SET ilosc = '0' WHERE mob_id = '"..npc.get_race().."';")
				local nagroda = tonumber(query("SELECT nagroda FROM player.boss_quest WHERE mob_id = '"..npc.get_race().."';"))
				pc.give_item2(nagroda, 1)	-- Ta funkcja nie da nagrody wszystkim zalogowanym tylko graczowi, ktory zabil ostatnia sztuke
				notice_all("Pokonalismy niebieska smierc!")
				notice_all("Ostatnia niebieska smierc zabil "..pc.get_name().." i to on otrzyma nagrodę. ")
			else
				query("UPDATE player.boss_quest SET ilosc = ilosc+1 WHERE mob_id = '"..npc.get_race().."';")
				notice_all("Gracz "..pc.get_name().." zabił "..ilosc.." z "..potrzeba.." niebieskich smierci!")
				--chat("Obecnie macie "..ilosc.." punktow za zabicie niebieskiej smierci. Potrzebujesz "..potrzeba.." ")
			end
		end
	end
end

Wszystko ok, ladnie dziala, ale sa 2 mniejsze problemy:

-gdy zabijemy 1 moba to wywala tekst ze zabito "0 z 10" zamiast zabito "1 z 10"

-musimy zabic 11 mobow

 

Mam propozycje rozwiazania problemu:

1.opcja.

Dodac 2 kolumny do bazy z ktorej quest bedzie pobieral i wpisywal dane osobno w zaleznosci od wyswietlania i faktycznej liczby zabic.

Tzn. 2 kolumny z wartoscia +1 w przypadku opisu i -1 w przypadku killi

2.opcja.

zrobic cos w stylu (nie za bardzo wiem jak to zrobic, aby pokazywalo o 1 wiecej):

notice_all("Gracz "..pc.get_name().." zabił "..ilosc..+1" z "..potrzeba..+1" niebieskich smierci!")

i zmniejszyc ilosc potrzebnych killi i killi w bazie o 1

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...