[Quick-Release] GuildMaster switchen zeitlich begrenzen

07/13/2014 17:43 『  』#1
Da ich in Skype gefragt wurde ob es eine möglichkeit gibt das switchen
des GildenMeisters in der Datenbank zeitlich zu begrenzen, habe ich
kurz drüber geschaut und wollte es mit euch Teilen - Because Sharing is Caring!

Leider weiß ich nicht in welchem Server (Zone, WM, Whatever) die
Prozedur gecallt wird, deswegen kann ich euch leider nicht sagen, wie Ihr die
Meldung "Meister kann nur alle xx geändert werden" angezeigt bekommt.

Naja okay - let's do it.

Kurzer Hinweiß:
Ich habe KEINEN Server, daher konnte ich das ganze nicht genaustens
Testen. Die Prozedur ansicht funktioniert hervorragend.
Sollten dennoch fehler auftreten bitte Ich euch diese direkt
zu melden, damit sie gefixt werden können!

__________________________________________________ ___________________

Zuerst verbindet ihr euch mit SQL Management Studio zu eurer Datenbank und
öffnet dort die xxx_Character DB.

[Only registered and activated users can see links. Click Here To Register...]

Sobald Ihr diese Datenbank geöffnet habt, klickt ihr Oben Links im SQLMMS
auf "New Query" / "Neue Abfrage".

[Only registered and activated users can see links. Click Here To Register...]

Dort fügt ihr folgendes ein:
Code:
/*
   Sonntag, 13. Juli 201416:38:46
   User: iKasu
   Server: (local)\DreckigeFiestaDB
   Database: w00_Character
   Application: 
*/

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.tGuild ADD
	dMasterChange datetime NOT NULL CONSTRAINT DF_tGuild_dMasterChange DEFAULT ('2000-01-01 00:00:00.000')
GO
ALTER TABLE dbo.tGuild SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Wie ihr sehen könnt, wird der Tabelle "tGuild" eine neue Spalte namens
dMasterChange hinzugefügt. Diese wird später verwendet um festzustellen,
wann der letzte Meister geändert wurde.

Bevor wir diese Abfrage ausführen, stellt sicher, dass Ihr die
xxx_Character Datenbank ausgewählt habt (Im Bild das Grüne).
Wenn alles passt, einmal F5 oder auf "Execute Query" / "Abfrage ausführen" klicken.

[Only registered and activated users can see links. Click Here To Register...]

Nun solltet ihr Unten bei "Message" / "Ausgabe" folgendes stehen haben:

[Only registered and activated users can see links. Click Here To Register...]

Fals ihr einen Fehler bekommt, das die Datenbank aufgrund von Sicherheitseinstellungen
nicht geändert werden kann, schaut unten im FAQ!

Sobald diese Abfrage ausgeführt ist, öffnet in der Character DB die Gespeicherten
Prozeduren. (Programmierbarkeit -> Gespeicherte Prozeduren)

[Only registered and activated users can see links. Click Here To Register...]

Dort sucht ihr nach der Prozedur: dbo.p_Guild_Member_SetGrade

[Only registered and activated users can see links. Click Here To Register...]

Bei dieser Prozedur macht Ihr ein rechtsklick drauf und klickt auf "Ändern".

[Only registered and activated users can see links. Click Here To Register...]

Nun solltet ihr auf der rechten Seite die Prozedur sehen.
Da ich wie bereits gesagt eine andere Datenbank haben könnte, merkt euch
bitte die ERSTE! Zeile der Prozedur.
Im Bild wäre das bei mir "USE [World00_Character]"

[Only registered and activated users can see links. Click Here To Register...]

Nun ersetzt Ihr die gesamte Prozedur mit:
Code:
USE [CHANGEME]
GO
/****** Object:  StoredProcedure [dbo].[p_Guild_Member_SetGrade]    Script Date: 07/13/2014 15:53:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[p_Guild_Member_SetGrade]

/*
Set Guild Member Grade
2006.2 By CJC

Input:
	See SQL
	
Output:
	nRet = 0,  Error
	nRet = 1,  OK
*/

@nNo int,
@nCharNo int,
@nGrade tinyint,

@nRet tinyint output

AS

SET NOCOUNT ON
SET @nRet = 0

IF @nGrade = 0
	BEGIN
		IF DATEDIFF(hour, Convert(DateTime, (SELECT dMasterChange from tGuild WHERE nNo = @nNo)), GETDATE()) < 24
			BEGIN
				SET @nRet = 0
				RETURN
			END
		ELSE
			BEGIN
				UPDATE tGuild SET dMasterChange = GETDATE() WHERE nNo = @nNo
				SET @nRet = @@ROWCOUNT
				IF @@ERROR <> 0 OR @@ROWCOUNT <> 1
					BEGIN
						SET @nRet = 0
						RETURN
					END
				ELSE
					BEGIN
						UPDATE tGuildMember SET nGrade = @nGrade WHERE nNo = @nNo AND nCharNo = @nCharNo
						SET @nRet = @@ROWCOUNT

						IF @@ERROR <> 0 OR @@ROWCOUNT <> 1
						BEGIN
							SET @nRet = 0
							RETURN
						END
					END
			END
	END
ELSE
	BEGIN

		UPDATE tGuildMember SET nGrade = @nGrade WHERE nNo = @nNo AND nCharNo = @nCharNo
		SET @nRet = @@ROWCOUNT

		IF @@ERROR <> 0 OR @@ROWCOUNT <> 1
		BEGIN
			SET @nRet = 0
			RETURN
		END

	END
Achtet hier bitte auf die erste Zeile! - Dort ändert Ihr "USE [CHANGEME]" zu dem, was
ihr euch gemerkt habt.
In meinem bsp. wäre das: "USE [World00_Character]"

Sobald ihr die erste Zeile ersetzt habt könnt Ihr wieder einen klick auf
"Execute Query" / "Abfrage ausführen" machen oder F5 drücken.

Nun solltet ihr wieder die Meldug bekommen, dass das Script ausgeführt wurde.

[Only registered and activated users can see links. Click Here To Register...]

Wenn das getan ist, seid Ihr damit fertig.
Nun sollte der Meister nurnoch alle 24h geändert werden können.

Fals Fragen diesbezüglich auftreten, schaut bitte in die FAQ.
Sollte eure Frage nicht beantwortet sein, schreibts in den Thread :)

__________________________________________________ ____________

__________________________________________________ _____________

FAQ:

Question: Ich bekomme einen Fehler wenn ich die erste Abfrage ausführen möchte :(

Question: Wie kann ich die Zeit einstellen?

07/14/2014 11:27 DuOtto#2
Gabs doch schon mal [Only registered and activated users can see links. Click Here To Register...], nur halt nicht so detailliert.
Trotzdem danke für die ausführliche Erklärung, bekommen die meisten halt leider nicht ohne so etwas hin.

Trotzdem kann man es meiner Meinung nach nur benutzen, um den Bug mit zwei Gildenmeistern zu unterbinden, also auf ein paar Sekunden einstellen.
Denn ohne Anzeige werden sich massig Spieler beschweren, dass es "nen Bug gibt"



Achja btw: Wäre mal interessant zu wissen, wie man von den Returns aus den Prozeduren auf die IDs von den Nachrichten kommt. Also genau was Kasu gesagt hat, wo die Prozedur gecallt wird. Weiß das zufällig jemand?
07/14/2014 13:49 『  』#3
Quote:
Originally Posted by DuOtto View Post
Gabs doch schon mal [Only registered and activated users can see links. Click Here To Register...], nur halt nicht so detailliert.
Trotzdem danke für die ausführliche Erklärung, bekommen die meisten halt leider nicht ohne so etwas hin.

Trotzdem kann man es meiner Meinung nach nur benutzen, um den Bug mit zwei Gildenmeistern zu unterbinden, also auf ein paar Sekunden einstellen.
Denn ohne Anzeige werden sich massig Spieler beschweren, dass es "nen Bug gibt"



Achja btw: Wäre mal interessant zu wissen, wie man von den Returns aus den Prozeduren auf die IDs von den Nachrichten kommt. Also genau was Kasu gesagt hat, wo die Prozedur gecallt wird. Weiß das zufällig jemand?
Hatte den Thread garnicht gesehen :o

Was die Nachricht betrifft, ich gehe mal stark davon aus, dass dies garnicht
in den Files drin ist, sonst wäre das ja schon standartmäßig in der Datenbank
so "eingetragen".

Steht ja in den Comments:
Code:
Output:
	nRet = 0,  Error
	nRet = 1,  OK
*/
Fals das im Server/Client schon drin sein sollte dann eventuell mal versuchen eine
2 oder -1 zu returnen - eventuell passiert ja dann schon etwas :D

Wenn nicht - dann gibts nur den umweg über RE im Client sowie im Server.
07/14/2014 14:32 DuOtto#4
Quote:
Originally Posted by ıKasu™ View Post
Hatte den Thread garnicht gesehen :o
Ist ja nicht schlimm, du hast es sowieso viel detaillierter gemacht :D



Quote:
Originally Posted by ıKasu™ View Post
Was die Nachricht betrifft, ich gehe mal stark davon aus, dass dies garnicht
in den Files drin ist, sonst wäre das ja schon standartmäßig in der Datenbank
so "eingetragen".

Steht ja in den Comments:
Code:
Output:
	nRet = 0,  Error
	nRet = 1,  OK
*/
Fals das im Server/Client schon drin sein sollte dann eventuell mal versuchen eine
2 oder -1 zu returnen - eventuell passiert ja dann schon etwas :D

Wenn nicht - dann gibts nur den umweg über RE im Client sowie im Server.
Ich denk auch, wahrscheinlich führt einer von den Diensten die Prozedur aus und schickt entsprechend der Rückgabe die ID aus den TextDatas an den Client.

Tja, so ist das halt, wenn man keinen Source hat :p
07/14/2014 15:27 『  』#5
Quote:
Originally Posted by DuOtto View Post
Ich denk auch, wahrscheinlich führt einer von den Diensten die Prozedur aus und schickt entsprechend der Rückgabe die ID aus den TextDatas an den Client.

Tja, so ist das halt, wenn man keinen Source hat :p
Selbst wenn die Dienste bereits soweit sind diesen Fehler zurückzugeben,
müsste man trozdem im Client suchen, wo & WIE er mit der Rückgabe
umgeht. Sieht man ja alleine schon an dem einfachen Error. Rückgabe ist 0
und der Client gibt keine Meldung aus (Nichtmal das etwas schief gelaufen ist).

So hätte man wenigstens die Meldung umschreiben können und den Return
bei einem Fehler zu -1 oder 2 setzten können.

& ja - Mit Source wäre allllllles einfacher.


Edit:

Hab mir den Char_Release Dienst mal angeschaut und dort wird die Prozedur jedenfals gecallt.
Leider checkt er dort nur ob der Call Okay oder gefailt ist und gibt leider nichts dem Client
zurück wenn er failt. - Somit wäre das im Client denke ich ebenfals nicht vorhanden x.x