- #1
Konu Sahibi
: serkankacan
[GELİŞMİŞ QUERY] vSRO Karakter Pozisyonu ile Çoklu Mob & Unique Spawn Ekleme
Tab_RefTactics, Tab_RefHive ve Tab_RefNest Tablolarına Koordinat Aramadan 20 Noktaya Kadar Otomatik Spawn Kurulumu
Tab_RefTactics, Tab_RefHive ve Tab_RefNest Tablolarına Koordinat Aramadan 20 Noktaya Kadar Otomatik Spawn Kurulumu
Merhaba değerli forum sakinleri,
Harita üzerinde dolaşarak tek tek bölge (Region) ve X, Y, Z koordinatlarını aramak yerine; karakterlerinizi oyunda mobun veya Unique'in doğmasını istediğiniz noktalara götürüp bıraktığınızda, sistemin bu koordinatları otomatik çekerek spawn oluşturmasını sağlayan optimize edilmiş SQL sorgusunu paylaşıyoruz.
Nasıl Çalışır?' Alıntı:
- Kaç noktada spawn istiyorsanız (1 ile 20 nokta arası), o kadar karakter açıp oyunda yaratığın doğmasını istediğiniz konumlara götürün ve karakterlerden çıkış yapın (Exit/Logout).
- Aşağıdaki sorguda bulunan
@monsterCodeNamealanına mob kodunu, karakter listesine de bu karakterlerin isimlerini yazın.- Kullanmadığınız karakter satırlarını olduğu gibi bırakabilirsiniz; sorgu sadece oyunda var olan karakterlerin koordinatlarını algılar ve dinamik olarak nest oluşturur.
Önemli Uyarı' Alıntı:DİKKAT:
- Karakterlerin koordinatlarının
_Chartablosuna doğru yazılması için oyundan tamamen çıkış yapmış (Disconnect / Offline) olmaları gerekir.- İşlem tamamlandıktan sonra yeni spawnların haritada belirmesi için GameServer modüllerinin yeniden başlatılması (Restart) gerekmektedir.
- İşlem öncesinde SRO_VT_SHARD yedeğinizi almayı unutmayınız.
Hatasız & Optimize Edilmiş SQL Query Kodu
SQL:
USE [SRO_VT_SHARD]
GO
-- ===================================================================
-- 1. ADIM: AYARLAMALAR (Burayı Kendi Konseptinize Göre Düzenleyin)
-- ===================================================================
DECLARE @monsterCodeName VARCHAR(128) = 'MOB_RM_ROC' -- Yaratığın _RefObjCommon CodeName128 kodu
DECLARE @minDelay INT = 60 -- Minimum spawn süresi (Saniye)
DECLARE @maxDelay INT = 120 -- Maksimum spawn süresi (Saniye)
DECLARE @initRadius INT = 100 -- Doğma yarıçapı
DECLARE @radius INT = 500 -- Dolaşma yarıçapı
-- Noktaları belirlemek için konumlandırdığınız karakter adları:
DECLARE @CharNames TABLE (CharName VARCHAR(16))
INSERT INTO @CharNames (CharName) VALUES
('CharNokta1'), ('CharNokta2'), ('CharNokta3'), ('CharNokta4'),
('CharNokta5'), ('CharNokta6'), ('CharNokta7'), ('CharNokta8'),
('CharNokta9'), ('CharNokta10'), ('CharNokta11'), ('CharNokta12'),
('CharNokta13'), ('CharNokta14'), ('CharNokta15'), ('CharNokta16'),
('CharNokta17'), ('CharNokta18'), ('CharNokta19'), ('CharNokta20')
-- ===================================================================
-- 2. ADIM: SİSTEM KONTROLLERİ VE HIVE/TACTICS OLUŞTURMA
-- ===================================================================
DECLARE @monsterID INT = (SELECT ID FROM dbo._RefObjCommon WHERE CodeName128 = @monsterCodeName)
IF (@monsterID IS NULL)
BEGIN
RAISERROR('HATA: Belirtilen canavar kodu (_RefObjCommon) veritabanında bulunamadı!', 16, 1)
RETURN
END
-- Geçerli karakterlerin koordinatlarını geçici tabloya topla
DECLARE @Spots TABLE (
RegionID INT,
PosX FLOAT,
PosY FLOAT,
PosZ FLOAT
)
INSERT INTO @Spots (RegionID, PosX, PosY, PosZ)
SELECT LatestRegion, POSX, POSY, POSZ
FROM dbo._Char
WHERE CharName16 IN (SELECT CharName FROM @CharNames)
IF NOT EXISTS (SELECT 1 FROM @Spots)
BEGIN
RAISERROR('HATA: Listelenen karakterlerden hiçbiri veritabanında bulunamadı! Karakter adlarını kontrol ediniz.', 16, 1)
RETURN
END
-- ID Atamaları (Tablolarda kayıt yoksa NULL düşmesini engellemek için ISNULL eklendi)
DECLARE @TacticsID INT = (SELECT ISNULL(MAX(dwTacticsID), 0) FROM dbo.Tab_RefTactics) + 1
DECLARE @HiveID INT = (SELECT ISNULL(MAX(dwHiveID), 0) FROM dbo.Tab_RefHive) + 1
-- [1] TACTICS EKLEME
SET IDENTITY_INSERT dbo.Tab_RefTactics ON
INSERT INTO dbo.Tab_RefTactics (
dwTacticsID, dwObjID, btAIQoS, nMaxStamina, btMaxStaminaVariance, nSightRange,
btAggressType, AggressData, btChangeTarget, btHelpRequestTo, btHelpResponSeto,
btBattleStyle, BattleStyleData, btDiversionBasis, DiversionBasisData1, DiversionBasisData2,
DiversionBasisData3, DiversionBasisData4, DiversionBasisData5, DiversionBasisData6,
DiversionBasisData7, DiversionBasisData8, btDiversionKeepBasis, DiversionKeepBasisData1,
DiversionKeepBasisData2, DiversionKeepBasisData3, DiversionKeepBasisData4, DiversionKeepBasisData5,
DiversionKeepBasisData6, DiversionKeepBasisData7, DiversionKeepBasisData8, btKeepDistance,
KeepDistanceData, btTraceType, btTraceBoundary, TraceData, btHomingType, HomingData,
btAggressTypeOnHoming, btFleeType, dwChampionTacticsID, AdditionOptionFlag, szDescString128
)
VALUES (
@TacticsID, @monsterID, 0, 500, 50, 200,
0, 0, 2, 2, 2,
0, 0, 5, 0, 0,
0, 0, 0, 30,
0, 0, 4, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 1, 500, 0, 0,
2, 0, 0, 112, @monsterCodeName
)
SET IDENTITY_INSERT dbo.Tab_RefTactics OFF
-- [2] HIVE EKLEME
SET IDENTITY_INSERT dbo.Tab_RefHive ON
INSERT INTO dbo.Tab_RefHive (
dwHiveID, btKeepMonsterCountType, dwOverwriteMaxTotalCount, fMonsterCountPerPC,
dwSpawnSpeedIncreaseRate, dwMaxIncreaseRate, btFlag, GameWorldID, HatchObjType, szDescString128
)
VALUES (
@HiveID, 0, 1, 0,
0, 0, 0, 1, 1, @monsterCodeName
)
SET IDENTITY_INSERT dbo.Tab_RefHive OFF
-- ===================================================================
-- 3. ADIM: NESTLERİ DİNAMİK OLARAK OLUŞTURMA (DÖNGÜ)
-- ===================================================================
DECLARE @CurRegion INT, @CurX FLOAT, @CurY FLOAT, @CurZ FLOAT
DECLARE @NestID INT = (SELECT ISNULL(MAX(dwNestID), 0) FROM dbo.Tab_RefNest)
DECLARE @EklenenNokta INT = 0
SET IDENTITY_INSERT dbo.Tab_RefNest ON
DECLARE SpotCursor CURSOR FOR
SELECT RegionID, PosX, PosY, PosZ FROM @Spots
OPEN SpotCursor
FETCH NEXT FROM SpotCursor INTO @CurRegion, @CurX, @CurY, @CurZ
WHILE @@FETCH_STATUS = 0
BEGIN
SET @NestID = @NestID + 1
SET @EklenenNokta = @EklenenNokta + 1
INSERT INTO dbo.Tab_RefNest (
dwNestID, dwHiveID, dwTacticsID, nRegionDBID,
fLocalPosX, fLocalPosY, fLocalPosZ, wInitialDir,
nRadius, nGenerateRadius, nChampionGenPercentage,
dwDelayTimeMin, dwDelayTimeMax, dwMaxTotalCount,
btFlag, btRespawn, btType
)
VALUES (
@NestID, @HiveID, @TacticsID, @CurRegion,
@CurX, @CurY, @CurZ, 0,
@radius, @initRadius, 0,
@minDelay, @maxDelay, 1,
0, 1, 0
)
FETCH NEXT FROM SpotCursor INTO @CurRegion, @CurX, @CurY, @CurZ
END
CLOSE SpotCursor
DEALLOCATE SpotCursor
SET IDENTITY_INSERT dbo.Tab_RefNest OFF
PRINT '====================================================='
PRINT 'BAŞARILI: ' + CAST(@EklenenNokta AS VARCHAR(10)) + ' adet spawn noktası sorunsuzca veritabanına eklendi!'
PRINT 'Mob Kodu : ' + @monsterCodeName
PRINT 'TacticsID: ' + CAST(@TacticsID AS VARCHAR(10)) + ' | HiveID: ' + CAST(@HiveID AS VARCHAR(10))
PRINT '====================================================='
Nasıl Uygulanır?
- Karakterleri Konumlandırın: Kaç adet spawn istiyorsanız (örneğin 3 farklı tepeye Roc veya Tiger Girl ekleyecekseniz), 3 farklı karakterle o konumlara gidip Exit diyerek oyundan çıkın.
- Kodu Düzenleyin: SQL sorgusunun en üstündeki
@monsterCodeNamedeğerine ekleyeceğiniz mobun kodunu yazın,@CharNamestablosundaki ilk satırlara da oyundan çıktığınız karakterlerin isimlerini yazın. - Çalıştırın: SQL Server Management Studio (SSMS) üzerinden F5 tuşuna basarak çalıştırın.
- Sunucuyu Yeniden Başlatın: Değişikliklerin haritaya yüklenmesi için GameServer pencerelerini yeniden başlatın.
Sorularınızı veya özel spawn ayarı taleplerinizi konu altından iletebilirsiniz. Herkese keyifli geliştirmeler!

