I have fixed siege for our server(s) back when Rising, Salvation, and Dk9 were the only true action 9 servers out to the public and running. I never shared my work in action 9 before so this is new to me, but I'm currently not doing anything in dekaron at this time, so I honestly don't mind giving the help.
This is the BinDateToDateTime. It's part one to the siege script. "Action 3 BinDate scripts will not work on action 9, from my personal experience."
Code:
USE [character]
GO
/****** Object: UserDefinedFunction [dbo].[FN_BinDateToDateTime] Script Date: 07/04/2014 07:19:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
/******************************************************************************
? ? : dbo.FN_BinDateToDateTime
? ? : Binary Date? DateTime ???? ????.
??? :
????:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2006-05-05 Han Ji Wook 1. ????
1.1 2009-12-22 Park Chanik 1. ?? 2010? ?? ?? ?? , 2010? ?? ??
******************************************************************************/
ALTER FUNCTION [dbo].[FN_BinDateToDateTime] (
@i_bin_time BINARY(4)
) RETURNS DATETIME
AS
BEGIN
DECLARE @v_datetime DATETIME
DECLARE @v_strtime VARCHAR(20)
-- 2009? 12? 22? ??
IF LEN(CAST(@i_bin_time AS INT)) < 10
BEGIN
SELECT @v_strtime = '200' + CAST(CAST(@i_bin_time AS INT) AS VARCHAR(20))
END
ELSE
BEGIN
SELECT @v_strtime = '20' + CAST(CAST(@i_bin_time AS INT) AS VARCHAR(20))
END
SELECT @v_strtime = SUBSTRING(@v_strtime,1,4)
+'-'+SUBSTRING(@v_strtime,5,2)
+'-'+SUBSTRING(@v_strtime,7,2)
+' '+SUBSTRING(@v_strtime,9,2)
+':'+SUBSTRING(@v_strtime,11,2)
SELECT @v_datetime = CAST(@v_strtime AS DATETIME)
RETURN @v_datetime
END
This is the main siege script. It's part two to the entire siege script. "Action 3 main siege scripts will work on action 9, also from my personal experience. Just be sure to change the necessary info to your likings before updating it!"
Code:
USE [Character];
GO
DECLARE @v_siege_no char(10)
DECLARE @guild_code varchar(10)
DECLARE @guild_name varchar(30)
DECLARE @v_strDate varchar(10)
DECLARE @v_regdate varchar(10)
DECLARE @v_strChannel varchar(2)
DECLARE @i_bychannel tinyint
DECLARE @o_dwDungeonRegistTime varbinary(4)
DECLARE @o_DeadFrontTimeInfo varbinary(1000)
DECLARE @o_sp_rtn int
DECLARE @o_dwRegistTimeStart varbinary(4)
DECLARE @o_dwRegistTimeEnd varbinary(4)
DECLARE @o_dwTaxRegistTime varbinary(4)
DECLARE @o_dwStartTime varbinary(4)
DECLARE @o_dwRegistTime varbinary(4)
DECLARE @v_strDate1 varchar(10)
DECLARE @i_GetDate datetime
DECLARE @v_siege_start_date varchar(14)
DECLARE @v_siege_start_time varbinary(4)
SET @i_GetDate=getdate()
SELECT @v_siege_start_date = CONVERT(VARCHAR(10), DATEADD(d, 15-DATEPART(dw, @i_GetDate), @i_GetDate), 112) + '210000'
SELECT @v_siege_start_time = SUBSTRING(@v_siege_start_date,4,1) * 100000000
+ SUBSTRING(@v_siege_start_date,5,2) * 1000000
+ SUBSTRING(@v_siege_start_date,7,2) * 10000
+ SUBSTRING(@v_siege_start_date,9,2) * 100
+ SUBSTRING(@v_siege_start_date,11,2)
SET @guild_code = '001'
SET @guild_name = 'FirstSiege'
SET @v_siege_no = SUBSTRING(dbo.FN_DateToShortStrDate(GetDate()), 3, 4) + '0001'
INSERT
INTO GUILD_INFO(guild_code, guild_name, guild_Level, bystate, bychannel)
VALUES (@guild_code, @guild_name, 3, 1, 1)
INSERT
INTO SIEGE_INFO(SIEGE_NO, CHANNEL_NO, GUILD_CODE, GUILD_NAME,
DWSTARTTIME, BYREGISTTIMEFLAG, DEFENDER_INFO, SIEGE_TAG)
VALUES (@v_siege_no, 1, @guild_code, @guild_name,@v_siege_start_time, 1, 0X0000, 'Y')
EXEC SP_SIEGE_START_TIME_U @guild_code,1,0x01,@v_siege_start_time output,@o_dwRegistTime output,@o_sp_rtn output
set @v_strDate1=dbo.FN_BinDateToDateTime(@v_siege_start_time)
declare @P1 varchar(13)
set @P1=NULL
declare @P2 varchar(33)
set @P2=NULL
declare @P3 varchar(25)
set @P3=NULL
declare @P4 varbinary(4)
set @P4=NULL
declare @P5 varbinary(4)
set @P5=NULL
declare @P6 varbinary(4)
set @P6=NULL
declare @P7 varbinary(4)
set @P7=NULL
declare @P8 varbinary(4)
set @P8=NULL
declare @P9 varbinary(4)
set @P9=NULL
declare @P10 varbinary(4)
set @P10=NULL
declare @P11 varbinary(2)
set @P11=NULL
declare @P12 varbinary(2)
set @P12=NULL
declare @P13 varbinary(2)
set @P13=NULL
declare @P14 int
set @P14=NULL
declare @P15 int
set @P15=NULL
declare @P16 varbinary(4)
set @P16=NULL
declare @P17 varbinary(996)
set @P17=NULL
declare @P18 varbinary(996)
set @P18=NULL
declare @P19 varbinary(1000)
set @P19=NULL
declare @P20 int
set @P20=NULL
exec SP_SIEGE_INFO_R 1, @P1 output, @P2 output, @P3 output, @P4 output, @P5 output, @P6 output, @P7 output, @P8 output, @P9 output, @P10 output, @P11 output, @P12 output, @P13 output, @P14 output, @P15 output, @P16 output, @P17 output, @P18 output, @P19 output, @P20 output
select @P1, @P2, @P3, @P4, @P5, @P6,@v_strDate1
Please note: I have had the ([ CRITICAL ERROR ] SP_SIEGE_INFO_R CALL FAIL) issue multiple times. I had to trial and error my way out, but I have successfully ran the script on 3 servers and they all worked great!
There is more to my process, but I'm almost sure you don't need it. If for some reason you do have the same or new issues, please feel free to let me know in this thread and Ill give you the [SP's] to fix it.