ACil Bakarmısınız. :) exp para -ye Düşme Olayı

vanhelsingxx

Kayıtlı Üye
Katılım
30 Ağustos 2012
Mesajlar
762
Reaction score
0
Puanları
16
Yaş
33
Beyler parayı - eksiye düşme olayını nasıl ortadan kaldırırım 21gbden fazla almasın.! :?:
 
UPDATE_USER_DATA prosedürünün içerisinde



Kod:
UPDATE	USERDATA

kodunun tam üstüne



Kod:
IF @Exp < 0

BEGIN

	SET @Exp = 0

END

IF @Gold < 0

BEGIN

	SET @Gold = 0

END
 
Saol Tamercim Tşkler. :)
 
UPDATE_USER_DATA Prosedüründe şu satırı bul;

Kod:
WHERE	strUserId	= @id



Hemen altına şunu yapıştır.



Kod:
IF @Gold > 2100000000

BEGIN

Update USERDATA SET Gold = 2100000000 WHERE strUserId = @id

END

IF @Exp > 2100000000

BEGIN

Update USERDATA SET Exp = 2100000000 WHERE strUserId = @id

END

IF @Gold < 0

BEGIN

Update USERDATA SET Gold = 0 WHERE strUserId = @id

END

IF @Exp < 0

BEGIN

Update USERDATA SET Exp = 0 WHERE strUserId = @id

END



Sorun kökten çözülmüştür :)
 
[MENTION=84]PENTAGRAM[/MENTION] altında degiskene baglı olarak update kodu var zaten ben degisken icerisindeki degeri 0 ladım :p



mantıksal olarak - oldugu icin < 0 olması lazım

programlamada deger >= sizeof(int) gibi kontrol edilebiliyor ( büyükse )



yinede isi garantiye alalım :D



Kod:
IF @Exp < 0 OR @Exp > 2100000000

BEGIN

	SET @Exp = 0

END

IF @Gold < 0 OR @Gold > 2100000000

BEGIN

	SET @Gold = 0

END



sql da size kontrolu nasıl yapılıyor bilmedigim icin bu sekilde en mantıklısı :D



örnek prosedür



Kod:
CREATE  PROCEDURE UPDATE_USER_DATA

	@id 		varchar(21),

	@Nation	tinyint,

	@Race		tinyint,

	@Class		smallint,

	@HairR		smallint,

	@HairG		smallint,

	@HairB		smallint,

	@HairColor	tinyint,

	@Rank		tinyint,

	@Title		tinyint,

	@Level		tinyint,

	@Exp		int,

	@Loyalty	int,

	@Face		tinyint, 

	@City		tinyint,	

	@Knights	smallint,

	@Fame		tinyint,

	@Hp		smallint,

	@Mp		smallint, 

	@Sp		smallint,

	@Str		tinyint,

	@Sta		tinyint,

	@Dex		tinyint,

	@Intel		tinyint,

	@Cha		tinyint,

	@Authority	tinyint,

	@Points	smallint,	

	@Gold		int,

	@Zone		tinyint,

	@Bind		smallint,

	@PX		int,

	@PZ		int,

	@PY		int,

	@dwTime	int,

	@QuestCount	smallint,

	@MannerPoint	int,

	@LoyaltyMonthly	int,

	@strSkill	varchar(10),

	@strItem	varchar(1200),

	@strSerial	varchar(1200),

	@strQuest	varchar(1000)

AS



IF @Exp < 0 OR @Exp > 2100000000[COLOR="SeaGreen"] -- Prosedür calıstırıldıgında girilen değere göre kontrol yapılıyor[/COLOR]

BEGIN

	SET @Exp = 0[COLOR="SeaGreen"] -- Prosedür icerisinde atanmış olan değişkenin değerini 0 yapıyor[/COLOR]

END

IF @Gold < 0 OR @Gold > 2100000000

BEGIN

	SET @Gold = 0

END



UPDATE	USERDATA

Set

	Nation		= @Nation,

	Race		= @Race,

	Class		= @Class,

	HairR		= @HairR,

	HairG		= @HairG,

	HairB		= @HairB,

	HairColor	= @HairColor,

	Rank		= @Rank,

	Title		= @Title,

	[Level]		= @Level,

	[Exp]		= @Exp, [COLOR="SeaGreen"]-- burada prosedür icerisinde atanmıs degiskeni Exp sütununa değer olarak giriyor[/COLOR]

	Loyalty		= @Loyalty,

	Face		= @Face, 

	City		= @City,	

	Knights		= @Knights,

	Fame		= @Fame,

	Hp		= @Hp,

	Mp		= @Mp, 

	Sp		= @Sp,

	Strong		= @Str,

	Sta		= @Sta,

	Dex		= @Dex,

	Intel		= @Intel,

	Cha		= @Cha,

	Authority	= @Authority,

	Points		= @Points,

	Gold		= @Gold,

	[Zone]		= @Zone,

	Bind		= @Bind,

	PX		= @PX,

	PZ		= @PZ,

	PY		= @PY,

	dwTime		= @dwTime,

	strSkill		= @strSkill,

	strItem		= @strItem,

	strSerial		= @strSerial,

	sQuestCount	= @QuestCount,

	strQuest		= @strQuest,

	MannerPoint 	= @MannerPoint,

	LoyaltyMonthly	= @LoyaltyMonthly

WHERE	strUserId	= @id

GO
 
[MENTION=84]PENTAGRAM[/MENTION] altında degiskene baglı olarak update kodu var zaten ben degisken icerisindeki degeri 0 ladım :p



mantıksal olarak - oldugu icin < 0 olması lazım

programlamada deger >= sizeof(int) gibi kontrol edilebiliyor ( büyükse )



yinede isi garantiye alalım :D



Kod:
IF @Exp < 0 OR @Exp > 2100000000

BEGIN

	SET @Exp = 0

END

IF @Gold < 0 OR @Gold > 2100000000

BEGIN

	SET @Gold = 0

END



sql da size kontrolu nasıl yapılıyor bilmedigim icin bu sekilde en mantıklısı :D



örnek prosedür



Kod:
CREATE  PROCEDURE UPDATE_USER_DATA

	@id 		varchar(21),

	@Nation	tinyint,

	@Race		tinyint,

	@Class		smallint,

	@HairR		smallint,

	@HairG		smallint,

	@HairB		smallint,

	@HairColor	tinyint,

	@Rank		tinyint,

	@Title		tinyint,

	@Level		tinyint,

	@Exp		int,

	@Loyalty	int,

	@Face		tinyint, 

	@City		tinyint,	

	@Knights	smallint,

	@Fame		tinyint,

	@Hp		smallint,

	@Mp		smallint, 

	@Sp		smallint,

	@Str		tinyint,

	@Sta		tinyint,

	@Dex		tinyint,

	@Intel		tinyint,

	@Cha		tinyint,

	@Authority	tinyint,

	@Points	smallint,	

	@Gold		int,

	@Zone		tinyint,

	@Bind		smallint,

	@PX		int,

	@PZ		int,

	@PY		int,

	@dwTime	int,

	@QuestCount	smallint,

	@MannerPoint	int,

	@LoyaltyMonthly	int,

	@strSkill	varchar(10),

	@strItem	varchar(1200),

	@strSerial	varchar(1200),

	@strQuest	varchar(1000)

AS



IF @Exp < 0 OR @Exp > 2100000000[COLOR="SeaGreen"] -- Prosedür calıstırıldıgında girilen değere göre kontrol yapılıyor[/COLOR]

BEGIN

	SET @Exp = 0[COLOR="SeaGreen"] -- Prosedür icerisinde atanmış olan değişkenin değerini 0 yapıyor[/COLOR]

END

IF @Gold < 0 OR @Gold > 2100000000

BEGIN

	SET @Gold = 0

END



UPDATE	USERDATA

Set

	Nation		= @Nation,

	Race		= @Race,

	Class		= @Class,

	HairR		= @HairR,

	HairG		= @HairG,

	HairB		= @HairB,

	HairColor	= @HairColor,

	Rank		= @Rank,

	Title		= @Title,

	[Level]		= @Level,

	[Exp]		= @Exp, [COLOR="SeaGreen"]-- burada prosedür icerisinde atanmıs degiskeni Exp sütununa değer olarak giriyor[/COLOR]

	Loyalty		= @Loyalty,

	Face		= @Face, 

	City		= @City,	

	Knights		= @Knights,

	Fame		= @Fame,

	Hp		= @Hp,

	Mp		= @Mp, 

	Sp		= @Sp,

	Strong		= @Str,

	Sta		= @Sta,

	Dex		= @Dex,

	Intel		= @Intel,

	Cha		= @Cha,

	Authority	= @Authority,

	Points		= @Points,

	Gold		= @Gold,

	[Zone]		= @Zone,

	Bind		= @Bind,

	PX		= @PX,

	PZ		= @PZ,

	PY		= @PY,

	dwTime		= @dwTime,

	strSkill		= @strSkill,

	strItem		= @strItem,

	strSerial		= @strSerial,

	sQuestCount	= @QuestCount,

	strQuest		= @strQuest,

	MannerPoint 	= @MannerPoint,

	LoyaltyMonthly	= @LoyaltyMonthly

WHERE	strUserId	= @id

GO



Benim ordaki amacım eğer adam 21 gb'ye veya 2 milyar 100 milyon exp pointe sahipse sıfırlamak yerine maksimum değeri vermek :) Yani user sonra arkamızdan sövmesin demi :D



En güzeli BigInt veya Unsigned int. Unsigned int ile kapasiteyi iki kat arttırabilirsin, nasıl olsa negatif değerlere ihtiyacımız yok :)


 
o zaman



IF @Exp < 0 OR @Exp > 2100000000

BEGIN

SET @Exp = 2100000000

END

IF @Gold < 0 OR @Gold > 2100000000

BEGIN

SET @Gold = 2100000000

END



:f:
 
Merhaba, paranin eksiye dusmesini engellemiyor bu kod. Ornegin uzerimizde 500k para var ve 5m lik bir itemi npcden almaya calistigimiz zaman para eksiye dusuyor ve tekrar para ekleyince bu defa 21 gb geliyor karaktere. Bununla ilgili nereye bakmam gerekir? Yol gosterebilecek olan var mi? Tesekkurler.
 
Geri
Üst Alt
Reklam
Reklam