- #1
Konu Sahibi
: serkankacan
[REHBER & SİSTEM] vSRO Teleport Taşı / NPC Yerini Değiştirme (Taşıma)
Karakter Koordinatlarını Referans Alarak _RefObjCommon Üzerinden Teleport Kapısı veya NPC Konumu Güncelleme
Karakter Koordinatlarını Referans Alarak _RefObjCommon Üzerinden Teleport Kapısı veya NPC Konumu Güncelleme
Merhaba değerli forum sakinleri,
Silkroad Online sunucunuzda bir kasaba teleport taşını (Gate), zindan kapısını veya sabit bir NPC'yi farklı bir konuma (örneğin Jangan önüne, yeni bir arenaya veya kaleye) taşımak istediğinizde tek tek koordinat aramak yerine; bir GM karakterini hedef noktaya götürüp karakterin durduğu yeri doğrudan SQL üzerinden ilgili teleporta aktarabilirsiniz.
Aşağıda hem koordinat yuvarlama hatalarından arındırılmış optimize SQL kodunu hem de istemci (Media.pk2) tarafındaki eşitleme adımlarını bulabilirsiniz.
Kritik Koordinat & Senkronizasyon Uyarısı' Alıntı:DİKKAT:
- Koordinatlarını alacağınız karakter (Örn:
[GM]PvP) hedef noktaya gittikten sonra kesinlikle oyundan çıkış yapmalı (Exit / Relog) ki güncel konum veritabanına yazılabilsin.- Koordinat sütunları kesirli (`real`) değerler taşır. Değişkenler `FLOAT` olarak tanımlanmıştır; böylece kapı veya NPC zeminin altına gömülmez ya da havada asılı kalmaz.
- İş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: DEĞİŞKENLER
-- ===================================================================
DECLARE @TargetBuildingCode VARCHAR(128) = 'STORE_TQ_SNAKEGATE' -- Yeri değiştirilecek Teleport/NPC Kodu
DECLARE @ReferenceCharName VARCHAR(16) = '[GM]PvP' -- Koordinatları alınacak karakter adı
-- Kontroller: Eşya/Bina ve Karakter Veritabanında Mevcut mu?
DECLARE @BuildingID INT = (SELECT ID FROM dbo._RefObjCommon WITH (NOLOCK) WHERE CodeName128 = @TargetBuildingCode)
DECLARE @CharID INT = (SELECT CharID FROM dbo._Char WITH (NOLOCK) WHERE CharName16 = @ReferenceCharName)
IF (@BuildingID IS NULL)
BEGIN
RAISERROR('HATA: Belirtilen teleport/bina kodu (_RefObjCommon) bulunamadı!', 16, 1)
RETURN
END
IF (@CharID IS NULL)
BEGIN
RAISERROR('HATA: Belirtilen referans karakter (_Char) bulunamadı!', 16, 1)
RETURN
END
-- ===================================================================
-- 2. ADIM: KARAKTERİN KONUM BİLGİLERİNİ ÇEKME (FLOAT HASSASİYETİ)
-- ===================================================================
DECLARE @RegionID SMALLINT
DECLARE @PosX REAL
DECLARE @PosY REAL
DECLARE @PosZ REAL
SELECT
@RegionID = LatestRegion,
@PosX = PosX,
@PosY = PosY,
@PosZ = PosZ
FROM dbo._Char WITH (NOLOCK)
WHERE CharID = @CharID
-- ===================================================================
-- 3. ADIM: TELEPORT BİNASINI YENİ KONUMA TAŞIMA
-- ===================================================================
UPDATE dbo._RefObjCommon
SET
RegionID = @RegionID,
OffsetX = @PosX,
OffsetY = @PosY,
OffsetZ = @PosZ
WHERE ID = @BuildingID
PRINT '================================================================='
PRINT 'BAŞARILI: ' + @TargetBuildingCode + ' yeni koordinatlarına taşındı!'
PRINT 'RegionID: ' + CAST(@RegionID AS VARCHAR(10))
PRINT 'X: ' + CAST(@PosX AS VARCHAR(20)) + ' | Y: ' + CAST(@PosY AS VARCHAR(20)) + ' | Z: ' + CAST(@PosZ AS VARCHAR(20))
PRINT '================================================================='
Client (Media.pk2) Eşitleme Adımları
Teleport taşının yeni yerinde fiziki olarak oyuncuların ekranında görünmesi ve tıklanabilmesi için istemci dosyasını güncellemelisiniz:
- PK2 editörü ile Media.pk2 dosyanızı açın.
server_dep\silkroad\textdata\teleportbuilding.txtdosyasını dışarı aktarın (Export).- Dosyada
STORE_TQ_SNAKEGATE(veya değiştirdiğiniz kod) satırını bulun. - Sorgu sonucunda Messages panelinde yazan yeni RegionID, PosX, PosY, PosZ değerlerini ilgili sütunlara yapıştırın.
- Dosyayı kaydedip tekrar Media.pk2 içine import edin ve oyuncularınıza patch olarak iletin.
- Sunucudaki GameServer ve ShardManager modüllerini yeniden başlatın.
Nasıl Uygulanır?
- Oyuna GM karakterinizle girip teleportu nereye koymak istiyorsanız tam o noktada durun.
- Karakterinizle oyundan tamamen çıkış yapın (Exit).
- SQL Server Management Studio (SSMS) üzerinde yukarıdaki sorguyu açın.
- En üstteki
@TargetBuildingCodeve@ReferenceCharNamealanlarını doldurup F5 tuşuna basın. - GameServer'ı yeniden başlattığınızda teleport taşının belirlediğiniz noktada başarıyla doğduğunu göreceksiniz.
Sorularınızı ve takıldığınız yerleri bu konu altından iletebilirsiniz. Herkese keyifli geliştirmeler!

